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

.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代码中手动声明匹配的接口即可调用:

  1. 声明对应接口和类ID:
type
  IConvertor = interface(IUnknown)
    ['{12345678-3e60-4c56-abcd-13d4098434f7}']
    function ConvertPatient(s: WideString): WideString; stdcall;
  end;

const
  CLSID_Convertor: TGUID = '{你为Convertor类预定义的GUID}';
  1. 调用示例:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 03:45:06