.NET 5创建COM组件无法生成TLB文件及注册失败问题咨询
.NET 5 COM组件对接Delphi解决方案
核心疑问解答
- .NET 5 完全支持COM开发,你遇到的工具报错是因为
tlbexp、regasm均为.NET Framework专属工具,不兼容.NET 5+程序集,属于正常现象 - 无TLB文件场景下非托管代码可通过手动匹配接口定义的方式直接调用,不需要依赖TLB生成的绑定代码
问题根因说明
xxx.comhost.dll是.NET 5生成的原生Win32 COM宿主文件,不属于.NET托管程序集,因此regasm无法识别- regsvr32仅负责注册COM类的注册表项,本身不具备生成类型库的能力
- .NET 5+默认不会自动生成TLB文件,需要手动处理
解决方案
方案一:生成TLB文件供Delphi导入
方式1:IDL手动编译生成TLB
你已经定义了固定GUID的IUnknown接口,直接编写对应IDL文件即可,示例如下:
import "unknwn.idl"; [ object, uuid(12345678-3e60-4c56-abcd-13d4098434f7), pointer_default(unique) ] interface IConvertor : IUnknown { HRESULT ConvertPatient([in] BSTR s, [out, retval] BSTR* result); }; [ uuid(你为Convertor类预定义的唯一GUID) ] coclass Convertor { interface IConvertor; };
给你的C# Convertor类补充Guid特性和IDL中coclass的GUID保持一致:
[ComVisible(true)] [Guid("你预定义的Convertor类GUID")] [ClassInterface(ClassInterfaceType.None)] public class Convertor : IConvertor { // 原有实现不变 }
使用Visual Studio自带的midl工具执行编译命令即可得到TLB文件:midl 你的IDL文件名.idl /tlb Convertor.tlb
生成的TLB可直接在Delphi中导入生成调用单元。
方式2:借用.NET Framework项目导出TLB
新建一个.NET Framework 4.x类库项目,将IConvertor接口、Convertor类的代码原封不动复制到该项目中,在项目属性中勾选「生成COM互操作类型库」,编译后即可得到兼容.NET 5 COM组件的TLB文件,无需修改任何定义。
方案二:无TLB直接在Delphi中调用
不需要生成TLB,直接在Delphi代码中手动声明匹配的接口即可调用:
- 声明对应接口和类ID:
type IConvertor = interface(IUnknown) ['{12345678-3e60-4c56-abcd-13d4098434f7}'] function ConvertPatient(s: WideString): WideString; stdcall; end; const CLSID_Convertor: TGUID = '{你为Convertor类预定义的GUID}';
- 调用示例:
var conv: IConvertor; res: WideString; begin CoInitialize(nil); try if Succeeded(CoCreateInstance(CLSID_Convertor, nil, CLSCTX_ALL, IID_IConvertor, conv)) then begin res := conv.ConvertPatient('测试患者'); ShowMessage(res); end; finally conv := nil; CoUninitialize; end; end;
额外注意事项
- 如果你开启了免注册COM,不需要执行regsvr32注册,只需要将.NET 5编译生成的所有文件(xxx.dll、xxx.comhost.dll、xxx.runtimeconfig.json、依赖的第三方dll)和Delphi编译的exe放在同一目录,合并对应manifest即可正常调用
- 必须保证Delphi编译的程序平台和.NET 5项目的平台一致,你当前.NET 5设置为x86,Delphi也需要编译为32位程序,否则会调用失败
内容的提问来源于stack exchange,提问作者Gaston
相关产品推荐
相关产品推荐

