Windows 10.16299 Windows Runtime Component编译错误解决咨询
解决WinRT组件中使用Realm编译出错的问题
嘿,我之前也碰到过类似的情况,咱们一步步拆解问题搞定它!
为啥会出错?
Realm的UWP NuGet包带有原生非托管的二进制文件,而Windows Runtime Component(也就是你新建的后台任务项目)在编译生成winmd文件时,要求所有依赖的库必须是纯托管、符合WinRT导出规则的。Realm的原生部分根本过不了winmdexp.exe的检查,这就是编译报错的核心原因。
靠谱的解决方案:用App Service中转
不能直接在WinRT组件里用Realm,那咱们把同步逻辑留在主UWP应用里,让后台任务通过「应用服务(App Service)」调用主应用来执行同步就行,具体步骤如下:
1. 给主应用添加App Service
- 打开主应用的
Package.appxmanifest,切换到「声明」标签,添加「应用服务」声明,给它起个名字比如SyncAppService - 准备好在主应用中处理后台激活请求,用来接收后台任务的调用并执行Realm同步逻辑
2. 改造后台任务项目
- 先把后台任务里的Realm和Newtonsoft.Json引用删掉(如果后台任务不需要自行处理JSON,就全部移除)
- 后台任务的
Run方法只负责通过App Service连接主应用,发送“同步数据”的指令:
public async void Run(IBackgroundTaskInstance taskInstance) { var deferral = taskInstance.GetDeferral(); try { var appServiceConnection = new AppServiceConnection(); appServiceConnection.AppServiceName = "SyncAppService"; // 和manifest里的名称保持一致 appServiceConnection.PackageFamilyName = Package.Current.Id.FamilyName; var connectionStatus = await appServiceConnection.OpenAsync(); if (connectionStatus == AppServiceConnectionStatus.Success) { var message = new ValueSet(); message.Add("Command", "StartSync"); await appServiceConnection.SendMessageAsync(message); } } finally { deferral.Complete(); } }
3. 主应用中处理同步请求
在主应用的App.xaml.cs里重写OnBackgroundActivated方法,接收到后台任务的指令后,执行你的Realm同步逻辑:
protected override void OnBackgroundActivated(BackgroundActivatedEventArgs args) { base.OnBackgroundActivated(args); var deferral = args.TaskInstance.GetDeferral(); var appServiceArgs = args.TaskInstance.TriggerDetails as AppServiceTriggerDetails; if (appServiceArgs != null && appServiceArgs.Name == "SyncAppService") { // 这里放你原来的Realm同步代码 _ = SyncRealmDataAsync(); } deferral.Complete(); } private async Task SyncRealmDataAsync() { // 你的同步逻辑,比如拉取数据、更新Realm数据库 var realm = Realm.GetInstance(); // ... 你的同步代码 }
应急替代方案(不推荐)
如果不想折腾App Service,也可以让后台任务把同步到的数据存在本地文件中(用Newtonsoft.Json序列化),等主应用启动后再把文件里的数据导入Realm。但这种方式需要自行处理数据冲突、一致性问题,不如App Service方案稳妥。
最后验证
把后台任务里的Realm相关代码和引用全部清理掉,重新编译后台任务项目,应该就能正常生成winmd文件了。部署后测试定时触发功能,看看同步逻辑能不能正常运行。
内容的提问来源于stack exchange,提问作者Guido Neele
相关产品推荐
相关产品推荐

