主题
Windows 从零接入晞晗IM
本页面向 .NET 8 WPF 应用。完成后,你可以连接账号、监听事件并发送第一条文字消息。
1. 准备接入信息
向服务端负责人领取 Server URL、App ID、当前用户 ID 和一个对端测试用户 ID。 正式环境还需要应用自己的后台提供短期 XHIM 凭证。
2. 新建工程并安装 NuGet
Visual Studio 新建 .NET 8 WPF Application,并选择与 XHIM Native Runtime 一致 的架构,例如 x64。
powershell
dotnet add package XHIM.SDK --version <团队锁定的版本>
dotnet add package XHIM.UI.Wpf --version <同一版本>XHIM.UI.Wpf 是可选 UI 包。完全自定义 WPF 页面时只安装 XHIM.SDK。
3. 连接当前账号
Development Server 已开启测试登录时:
csharp
using XHIM;
var client = await XHIMClient.ConnectAsync(
"https://im-test.example.com",
currentUserId);正式环境增加业务凭证提供器:
csharp
var client = await XHIMClient.ConnectAsync(
"https://im.example.com",
currentUserId,
appId: "your-app",
authentication: XHIMAuthentication.Business(
cancellationToken => accountApi.GetXHIMCredentialAsync(
currentUserId,
cancellationToken)));把 Client 放在账号级 Service 中。Window 关闭重开时不要重复创建同一账号 Client。
4. 监听变化并发送消息
csharp
var eventTask = Task.Run(async () =>
{
await foreach (var eventValue in client.Events(cancellationToken))
messageStore.HandleXHIMEvent(eventValue);
}, cancellationToken);
var direct = await client.GetOrCreateDirectConversationAsync(
"bob",
cancellationToken);
await client.SendTextAsync(
direct.ConversationId,
"你好,晞晗IM",
cancellationToken: cancellationToken);收到事件后重新查询当前会话或消息。不要在 WPF 页面里手工维护另一份消息数据库。
5. 登出和换号
csharp
await client.LogoutAsync(cancellationToken);
await client.DisposeAsync();普通 Window 关闭时只取消该页面的订阅。真正登出或切换账号时才释放账号 Client。
6. 常用功能入口
| 任务 | 方法 |
|---|---|
| 查询会话 | ListConversationsAsync(...) |
| 查询消息 | ListMessagesAsync(...) |
| 标记已读 | MarkConversationReadAsync(...) |
| 查询用户资料 | GetCurrentUserProfileAsync(...) |
| 查询好友和群组 | ListFriendshipsAsync(...) / ListGroupsAsync(...) |
| 创建群 | CreateGroupAsync(...) |
| 取消请求 | 传入 CancellationToken |
完整参数、返回值和错误见 SDK API Reference。
7. 二次开发建议
text
AccountSession
└── XHIMService 持有 Client 与事件任务
├── Repositories 查询会话、消息、好友和群组
└── ViewModels 把不可变结果交给 WPF 页面这种结构可以直接用于已有 MVVM 或 MVP 工程。页面不接触凭证、Native Handle 或 本地数据库。
8. 常见问题
启动时提示找不到 xhim_core_v1.dll
NuGet 缺少当前 RID 的 Native Runtime,或应用架构与 DLL 不一致。更换完整发行包, 不要手工复制其他版本 DLL。
能发送但页面不刷新
确认账号 Service 正在消费 client.Events(...),并在事件后重新查询消息。
应用退出时进程不结束
确认真正登出时已经调用 DisposeAsync(),并取消页面自己的事件任务。