在WPF应用中调用UWP类库遇类型未注册错误求助
问题描述
使用Visual Studio 2022搭建解决方案,包含一个WPF C# UI应用和一个C++编写的Universal Windows (UWP)类库,前者引用后者。编译时C#编译器可识别类库中的类,但运行UI应用时,首次实例化UWP类会抛出以下异常:
System.TypeLoadException: 'Requested Windows Runtime type 'MyLib.MyClass' is not registered.'
COMException: Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))
疑问:这是常规COM注册问题还是其他原因?UWP库没有DllRegisterServer,无法用regsvr32注册,WPF可执行文件所在的bin\Debug目录中已有该DLL副本。调试输出显示类库的winmd文件已加载,但库本身未加载。此前有类似问题是关于.NET调用系统UWP API,而非自定义类库。补充:该问题并非WPF特有,测试的.NET Framework控制台项目也出现同样情况。
原因分析与解决方法
这不是常规COM注册问题,核心原因是自定义UWP类库需要通过Appx部署才能被.NET Framework应用正确加载,UWP组件的加载机制和传统COM组件完全不同:
- UWP组件基于Windows Runtime (WinRT),依赖Appx包的注册机制,而非传统的注册表COM注册。即使把DLL复制到输出目录,系统也无法识别它是合法的WinRT组件。
- 调试输出中winmd文件加载只是让编译器识别类型,实际运行时需要组件的Appx注册信息来定位和加载DLL。
解决步骤
- 将UWP类库打包为Appx包
- 在Visual Studio中右键UWP类库项目,选择「发布」->「创建应用包」,按向导生成Appx包(可选择本地测试证书)。
- 部署Appx包
- 双击生成的Appx包完成安装,或使用PowerShell命令:
Add-AppxPackage -Path "你的包路径\MyLib_1.0.0.0_x64_Debug.appx"
- 双击生成的Appx包完成安装,或使用PowerShell命令:
- 统一目标平台
- 确保WPF/控制台项目的目标平台与UWP类库一致(如均为x64),避免架构不匹配导致加载失败。
- 验证部署状态
- 打开PowerShell运行
Get-AppxPackage | Where-Object {$_.Name -eq "MyLib"},确认包已正确安装。
- 打开PowerShell运行
开发调试优化
如果是开发阶段调试,可让Visual Studio自动部署UWP组件:
- 右键解决方案选择「属性」->「启动项目」,选择「多个启动项目」,将UWP类库项目的操作设为「部署」,WPF项目设为「启动」。每次调试时VS会自动部署UWP组件,无需手动打包安装。
内容的提问来源于stack exchange,提问作者Seva Alekseyev
相关产品推荐
相关产品推荐

