如何在C++程序中导入comhost实现C#类早期绑定?
解决方案:C++早期绑定调用.NET 8 COM宿主中的C#方法
核心问题分析
main_comhost.dll是.NET 5+推出的COM宿主包装文件,它本身既不是类型库(.tlb),也不是标准.NET程序集,所以直接对它执行#import、regasm、tlbexp或dscom都会失败。所有类型导出操作必须针对原始的C#类库DLL(而非comhost.dll)执行。
步骤1:从原始C#程序集导出TLB
针对你的C#类库文件(比如YourCSharpLibrary.dll)执行类型库导出:
- 使用
tlbexp命令:tlbexp YourCSharpLibrary.dll /out:main.tlb - 或使用
regasm命令(同时会注册COM组件):regasm YourCSharpLibrary.dll /tlb:main.tlb
这会生成可用于C++早期绑定的main.tlb文件,和你之前正常工作的TLB一致。
步骤2:C++项目中保持早期绑定
继续使用你原本的#import语句:
#import "main.tlb" no_namespace, named_guids
部署时只需将main_comhost.dll、你的C#类库DLL、C++可执行文件放在同一目录,或者执行regsvr32 main_comhost.dll完成COM注册,即可正常调用C#方法,无需手动编写InvokeMethod这类后期绑定代码。
解决dscom工具的问题(可选)
如果想用dscom导出TLB,需注意以下几点:
- 安装方式:
- 全局安装:
dotnet tool install --global dscom - 本地安装:先在项目根目录执行
dotnet new tool-manifest,再执行dotnet tool install dscom
- 全局安装:
- 权限问题:
- 以管理员身份运行命令行,或在PowerShell中执行
Set-ExecutionPolicy RemoteSigned(调整执行策略)
- 以管理员身份运行命令行,或在PowerShell中执行
- 正确执行导出:
必须针对原始C#程序集,而非comhost.dll:dscom tlb export YourCSharpLibrary.dll -o main.tlb
内容的提问来源于stack exchange,提问作者Dominique
相关产品推荐
相关产品推荐

