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

Delphi导入含7+函数的C# COM组件报错问题求助

Delphi 10.3导入C# COM组件报错OLE Error 80131124的原因与解决

问题现象

在Delphi 10.3中通过「Components->Import Component->.Net Assembly」导入C#编写的COM组件时:

  • 当COM接口中函数数量≤7个时,可正常生成_TLB.pas文件并使用
  • 当函数数量≥8个时,导入过程抛出「OLE Error 80131124」错误
    手动修改_TLB.pas添加新增函数的定义后,组件可正常调用,但需明确报错根因及规范解决方案。

报错原因

OLE Error 80131124对应CLR的COR_E_SIGNATUREMISMATCH(签名不匹配)异常,本质是Delphi 10.3的.NET组件导入工具对双接口(Dual Interface)的DISPID解析存在兼容性bug:

  1. 你的C#接口标记了[InterfaceType(ComInterfaceType.InterfaceIsDual)],会生成同时支持vtable和IDispatch的双接口
  2. .NET为双接口分配DISPID时,前7个方法的ID符合Delphi导入工具的预期,但第8个及以后的ID会超出工具的解析范围,导致导入时触发签名不匹配错误
  3. 手动修改_TLB.pas能正常工作,说明组件本身的COM注册与实现无问题,仅Delphi导入工具无法正确解析超过7个方法的双接口类型库

正规解决方案

方案1:修改C#接口的COM类型(推荐)

将C#接口的InterfaceType改为InterfaceIsIUnknown或InterfaceIsIDispatch,避免使用双接口:

namespace comtest
{
    [ComVisible(true)]
    [Guid("0F6BF46C-8B5F-4CCD-8E0D-71C175AD8234")]
    // 改为仅支持vtable调用的IUnknown接口,性能更优
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IComInterface
    {
        int func1(); 
        int func2(); 
        int func3(); 
        int func4(); 
        int func5(); 
        int func6(); 
        int func7(); 
        int func8(); 
        int func9(); 
        int func10();
    }

    [ComVisible(true)]
    [Guid("9F39DD6D-053B-4DD6-850A-DC7D370E0506")]
    [ClassInterface(ClassInterfaceType.None)]
    public class ComClass : IComInterface
    {
        public int func1() => 1;
        public int func2() => 1;
        public int func3() => 1;
        public int func4() => 1;
        public int func5() => 1;
        public int func6() => 1;
        public int func7() => 1;
        public int func8() => 1;
        public int func9() => 1; 
        public int func10()=> 1;
    }
}

修改后重新编译注册组件,Delphi 10.3可正常导入任意数量方法的组件。

方案2:手动生成类型库再导入

绕过Delphi的.NET组件导入工具,直接用.NET官方工具生成类型库:

  1. 编译C#项目后,找到输出目录下的comtest.dll
  2. 打开Visual Studio开发者命令提示符,执行命令生成TLB:
    tlbexp.exe comtest.dll /out:comtest.tlb
    
  3. 在Delphi中通过「Components->Import Component->Import Type Library」选择生成的comtest.tlb,即可生成包含所有方法的_TLB.pas文件

方案3:升级Delphi版本

该bug在Delphi 10.4及后续版本中已被修复,升级到新版本后可直接使用原双接口代码完成导入。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 15:57:20