创建.NET5 C# COM DLL在Delphi 10.4中调用提示入口点找不到问题咨询
问题根因
你采用的调用方式不符合COM组件的调用规则:COM接口的方法不会作为普通DLL导出函数暴露,因此无法直接通过external关键字按函数名导入调用,这是报错找不到入口点的核心原因。
可选解决方法
方案1:沿用现有COM实现,调整Delphi调用逻辑
无需修改现有C#代码,仅调整Delphi侧调用方式即可:
- 生成COM类型库导入单元:在Delphi菜单栏依次选择【组件】→【导入类型库】,找到你已注册的
TestDLLForDelphiV2组件,确认后自动生成对应接口单元(默认命名规则为XXX_TLB.pas)。 - 修改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调用写法:
- 修改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; } } }
- 调整C#项目配置,移除
EnableComHosting、EnableRegFreeCom相关COM配置项,新增如下配置:
<PropertyGroup> <TargetFramework>net5.0</TargetFramework> <Platforms>x64</Platforms> <!-- 开启本地导出功能 --> <EnableUnmanagedExports>true</EnableUnmanagedExports> <GeneratePackageOnBuild>false</GeneratePackageOnBuild> </PropertyGroup>
- 编译后会生成带函数导出的
TestDLLForDelphiV2.dll,你原有Delphi的external导入写法可以直接正常使用。
通用注意事项
- 必须保证Delphi编译位数和C# DLL编译位数完全一致,禁止32位/64位混用
- 涉及字符串返回的接口,注意内存分配规则:建议由Delphi侧分配内存传入C#填充,或者C#返回字符串后使用对应释放接口释放内存,避免内存泄漏
内容的提问来源于stack exchange,提问作者Greg Bishop
相关产品推荐
相关产品推荐

