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

构建通过COM互操作供C#调用的Delphi COM组件(含SumIntegers函数)的技术求助

别慌,刚上手Delphi搞COM互操作确实容易找不到头绪,我给你一步步拆解,从注册版到免注册版都讲清楚,照着做就能跑通你的SumIntegers函数调用需求。

一、先实现注册版Delphi COM组件

这是最常规的方式,注册后系统能识别这个COM对象,C#调用起来最省心。

1. 创建Delphi COM项目框架

打开Delphi后按以下步骤操作:

  • 新建项目:选择「ActiveX Library」(这会生成一个专门承载COM对象的DLL项目)
  • 添加COM对象:点击菜单栏「Component」→「New Component」→ 选「ActiveX」分类下的「COM Object」,设置:
    • Class Name:比如TSumCalculator
    • Interface Name:比如ISumCalculator
    • 其他选项保持默认,点击OK生成模板代码

2. 实现SumIntegers方法

生成的代码里有两个关键单元:定义接口的_TLB.pas,以及实现类的单元(比如SumCalculatorImpl.pas)。

  • 在接口单元(_TLB.pas)的ISumCalculator接口中添加方法声明:
type
  ISumCalculator = interface(IUnknown)
    ['{这里是自动生成的GUID,不要修改}']
    function SumIntegers(const a, b: Integer): Integer; safecall;
  end;
  • 在实现类单元的TSumCalculator类里实现方法:
function TSumCalculator.SumIntegers(const a, b: Integer): Integer; safecall;
begin
  Result := a + b;
end;

3. 编译并注册组件

  • 编译项目得到COM DLL(比如SumCalculator.dll)
  • 注册组件:右键点击DLL选择「用regsvr32注册」,或者在Delphi项目选项里勾选「Register for COM interop」,编译时会自动完成注册。
二、C#调用注册版COM组件

注册成功后有两种调用方式:

方式1:通过COM引用直接调用

  • 打开C#项目,右键「引用」→「添加引用」→ 切换到「COM」标签页,找到你创建的SumCalculator组件,添加引用。
  • 编写调用代码:
using System;
using SumCalculator; // 这个命名空间来自Delphi生成的TypeLib

class Program
{
    static void Main(string[] args)
    {
        ISumCalculator calculator = new SumCalculator();
        int result = calculator.SumIntegers(5, 3);
        Console.WriteLine($"计算结果:{result}");
    }
}

方式2:用tlbimp生成互操作程序集

如果COM引用找不到组件,手动用tlbimp工具生成:

  • 打开命令提示符,定位到COM DLL所在目录,执行:
tlbimp SumCalculator.dll /out:SumCalculator.Interop.dll
  • 在C#项目里引用生成的SumCalculator.Interop.dll,代码和上面一致。
三、免注册版COM组件(无需regsvr32)

如果不想修改系统注册表(比如随程序分发),可以用免注册COM方式,核心是通过manifest文件或直接加载DLL。

1. 准备COM DLL和Manifest文件

  • 确保COM DLL已编译完成,创建和DLL同名的manifest文件(比如SumCalculator.dll.manifest),替换里面的GUID(这些GUID在Delphi的_TLB.pas中可以找到):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity type="win32" name="SumCalculator" version="1.0.0.0" processorArchitecture="x86"/>
    <file name="SumCalculator.dll">
        <comClass clsid="{TSumCalculator的GUID}" progid="SumCalculator.SumCalculator" description="求和计算器COM对象"/>
        <typelib tlbid="{TypeLib的GUID}" version="1.0" helpdir=""/>
    </file>
</assembly>
  • 将manifest文件和COM DLL放在C#程序的输出目录中。

2. C#代码直接调用

无需添加COM引用,用ComImport特性声明接口和类:

using System;
using System.Runtime.InteropServices;

class Program
{
    // 声明Delphi的ISumCalculator接口,GUID要完全匹配
    [ComImport, Guid("{ISumCalculator的GUID}")]
    public interface ISumCalculator
    {
        [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
        int SumIntegers(int a, int b);
    }

    // 声明COM类,GUID是TSumCalculator的GUID
    [ComImport, Guid("{TSumCalculator的GUID}")]
    public class SumCalculatorClass
    {
    }

    static void Main(string[] args)
    {
        ISumCalculator calculator = new SumCalculatorClass();
        int result = calculator.SumIntegers(10, 20);
        Console.WriteLine($"计算结果:{result}");
    }
}
关键注意事项
  • GUID必须完全匹配:Delphi生成的接口、类、TypeLib的GUID要原封不动复制,写错一个字符都会调用失败。
  • 调用约定适配:Delphi用safecall,C#的ComImport会自动适配该调用约定,无需额外设置。
  • 位数一致:Delphi编译的DLL要和C#程序的位数统一(都是x86或x64),否则会加载失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 07:52:32