如何在基础Win32控制台应用中调用未暴露COM的C#/WinRT组件
解决方案
前置准备
首先确认你的C#组件使用正确的项目模板:不要使用UWP专属的C# Windows Runtime Component模板,改用面向.NET 5+的桌面C#/WinRT组件模板,该模板构建后会同时输出.dll业务实现文件和.winmd元数据文件,这是后续调用的基础。
Win32项目配置步骤
- 给你的Win32 x86控制台项目安装
Microsoft.Windows.CppWinRTNuGet包,确保包版本与你的组件版本兼容。 - 将C#/WinRT组件构建输出的.dll、.winmd两个文件复制到Win32项目的运行输出目录下,同时需要将
WinRT.Runtime.dll等C#/WinRT依赖的运行时文件一同复制。 - 给Win32项目新增应用清单文件(app.manifest),在清单的激活扩展节点中声明C#/WinRT组件内的可激活类,绑定对应的组件dll路径,不需要全局注册COM类即可完成运行时激活。
- 在Win32代码的入口位置,先调用
winrt::init_apartment()初始化WinRT单线程单元,之后即可引入自动生成的C++/WinRT头文件,正常实例化C#组件类、调用对应方法。
常见报错排查
如果运行时仍然抛出REGDB_E_CLASSNOTREG错误,按优先级排查以下问题:
- 组件dll、依赖运行时dll是否和Win32主程序放在同一目录
- 清单文件中声明的类命名空间、类名、关联的dll文件名是否和实际输出完全一致
- Win32项目和C#组件的构建架构是否统一为x86,避免架构不匹配导致的加载失败
差异说明
C++/WinRT模板项目和安装了NuGet包的原生Win32项目核心差异只有两处:模板项目默认自动生成了WinRT运行时初始化代码,以及自动补充了组件激活的清单配置,原生Win32项目手动补充这两项配置即可达到和模板项目完全一致的调用能力。
内容的提问来源于stack exchange,提问作者Thomas T
相关产品推荐
相关产品推荐

