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

创建.NET5 C# COM DLL在Delphi 10.4中调用提示入口点找不到问题咨询

问题根因

你采用的调用方式不符合COM组件的调用规则:COM接口的方法不会作为普通DLL导出函数暴露,因此无法直接通过external关键字按函数名导入调用,这是报错找不到入口点的核心原因。

可选解决方法

方案1:沿用现有COM实现,调整Delphi调用逻辑

无需修改现有C#代码,仅调整Delphi侧调用方式即可:

  1. 生成COM类型库导入单元:在Delphi菜单栏依次选择【组件】→【导入类型库】,找到你已注册的TestDLLForDelphiV2组件,确认后自动生成对应接口单元(默认命名规则为XXX_TLB.pas)。
  2. 修改Delphi调用代码:
unit Main;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
  TestDLLForDelphiV2_TLB; // 引用生成的类型库单元

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  calcObj: ICalc;
  i: Integer;
begin
  Memo.Clear;
  // 创建COM实例
  calcObj := CoCalc.Create;
  i := calcObj.Add;
  Memo.Lines.Add(IntToStr(i));
  // 释放接口(Delphi会自动管理引用计数,也可手动置空)
  calcObj := nil;
end;

end.

注意:如果使用免注册COM方案,需要将C#项目生成的.manifest文件和Delphi编译出的exe放在同目录,或者将manifest嵌入到Delphi exe的资源中。

方案2:改用原生DLL导出函数(更适合少量接口调用场景)

无需使用COM组件机制,直接将C#方法导出为普通DLL函数,调用逻辑和传统C DLL完全一致,适配你当前的Delphi调用写法:

  1. 修改C#代码,使用.NET 5+支持的UnmanagedCallersOnly特性标记导出函数:
using System.Runtime.InteropServices;

namespace TestDLLForDelphiV2
{
    public class Calc
    {
        // 导出函数必须为静态方法
        [UnmanagedCallersOnly(EntryPoint = "Add")]
        public static int Add()
        {
            int numberOne = 3;
            int numberTwo = 5;
            return numberOne + numberTwo;
        }         
    }
}
  1. 调整C#项目配置,移除EnableComHosting、EnableRegFreeCom相关COM配置项,新增如下配置:
<PropertyGroup>
  <TargetFramework>net5.0</TargetFramework>
  <Platforms>x64</Platforms>
  <!-- 开启本地导出功能 -->
  <EnableUnmanagedExports>true</EnableUnmanagedExports>
  <GeneratePackageOnBuild>false</GeneratePackageOnBuild>
</PropertyGroup>
  1. 编译后会生成带函数导出的TestDLLForDelphiV2.dll,你原有Delphi的external导入写法可以直接正常使用。
通用注意事项
  • 必须保证Delphi编译位数和C# DLL编译位数完全一致,禁止32位/64位混用
  • 涉及字符串返回的接口,注意内存分配规则:建议由Delphi侧分配内存传入C#填充,或者C#返回字符串后使用对应释放接口释放内存,避免内存泄漏

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 21:00:05