You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在基础Win32控制台应用中调用未暴露COM的C#/WinRT组件

解决方案

前置准备

首先确认你的C#组件使用正确的项目模板:不要使用UWP专属的C# Windows Runtime Component模板,改用面向.NET 5+的桌面C#/WinRT组件模板,该模板构建后会同时输出.dll业务实现文件和.winmd元数据文件,这是后续调用的基础。

Win32项目配置步骤

  • 给你的Win32 x86控制台项目安装Microsoft.Windows.CppWinRT NuGet包,确保包版本与你的组件版本兼容。
  • 将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 00:48:03