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

如何在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,需注意以下几点:

  1. 安装方式:
    • 全局安装:dotnet tool install --global dscom
    • 本地安装:先在项目根目录执行dotnet new tool-manifest,再执行dotnet tool install dscom
  2. 权限问题:
    • 以管理员身份运行命令行,或在PowerShell中执行Set-ExecutionPolicy RemoteSigned(调整执行策略)
  3. 正确执行导出:
    必须针对原始C#程序集,而非comhost.dll:
    dscom tlb export YourCSharpLibrary.dll -o main.tlb
    

内容的提问来源于stack exchange,提问作者Dominique

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 22:24:53