今天Osirisoo0O小哥遇到了个诡异的问题:UWP项目,目标版本和最低版本都是17763的时候,按照文档编写进程外后台任务,编译是通不过的。会提示类似下面的内容:
If it is not an audio background task, it is not allowed to have EntryPoint="BgTest.BackgroundTask.ToastTask" without ActivatableClassId in windows.activatableClass.inProcessServer.
我按照他说的测试一番,结果一毛一样。道理我都懂,可我写的是进程外后台任务,你给我提示进程内服务需要xxx是什么企图。
折腾了一段时间,不明白为什么会出现这个,但是整理出了一个临时的解决方案:
右键UWP的启动项目中的Package.appxmanifest文件,选择查看代码,然后在
<Package></Package>
代码段内的末尾添加如下内容:
<Extensions>
<Extension Category="windows.activatableClass.inProcessServer">
<InProcessServer>
<Path>CLRHost.dll</Path>
<ActivatableClass ActivatableClassId="Microsoft.UI.Xaml.Markup.ReflectionXamlMetadataProvider" ThreadingModel="both" />
</InProcessServer>
</Extension>
<Extension Category="windows.activatableClass.inProcessServer">
<InProcessServer>
<Path>{your background task file name}.winmd</Path>
<ActivatableClass ActivatableClassId="{your background task class full name}" ThreadingModel="both" />
</InProcessServer>
</Extension>
</Extensions>
这时候整个文档的结构应该是这样婶儿的:
<Package>
<Identity />
<!-- ...... -->
<Applications>
<!-- ...... -->
</Applications>
<Capabilities>
<!-- ...... -->
</Capabilities>
<!-- 刚加的部分 -->
<Extensions>
<Extension Category="windows.activatableClass.inProcessServer">
<InProcessServer>
<Path>CLRHost.dll</Path>
<ActivatableClass ActivatableClassId="Microsoft.UI.Xaml.Markup.ReflectionXamlMetadataProvider" ThreadingModel="both" />
</InProcessServer>
</Extension>
<Extension Category="windows.activatableClass.inProcessServer">
<InProcessServer>
<Path>BgTest.BackgroundTask.winmd</Path>
<ActivatableClass ActivatableClassId="BgTest.BackgroundTask.ToastTask" ThreadingModel="both" />
</InProcessServer>
</Extension>
</Extensions>
<!-- 刚加的部分结束 -->
</Package>
中间{}内的部分替换成你项目中的真实名称,比如我的测试项目是这样的:
<InProcessServer>
<Path>BgTest.BackgroundTask.winmd</Path>
<ActivatableClass ActivatableClassId="BgTest.BackgroundTask.ToastTask" ThreadingModel="both" />
</InProcessServer>
然后编译,这时候可以编译通过但是后台任务是无法触发的。下一步就比较重要了:把你刚刚加上的那段删掉。
嗝。
然后就正常了。不知道微软这是什么神操作。
这件事教会我们一个道理,能用进程内后台任务不用进程外后台任务,用新不用旧。
沙雕微软。
仅有一条评论
如果有错误请告诉我,谢谢各位大佬
It's not working, it says: Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))