可以在 C# 中调用和使用 Delphi DLL 吗?

Can a Delphi DLL be PInvoked and used in C#?

我正在尝试迁移一个用 C++ 生成器构建的应用程序。由于时间限制,我们的客户希望我们导入 VCL 功能而不是寻找 .net 等价物或创建一个新功能。

我试图调用 rtl100.bpl 的 ExtractRelativePath 函数,该函数将 AnsiString 作为 return 和参数。然后我使用 IntPtr 来传递和获取字符串,但是在调用 API 时会发生 AccessViolationException。

这是来自rtl100.bpl

的函数原型
PACKAGE AnsiString __fastcall ExtractRelativePath(const AnsiString BasrName, AnsiString DestName);

我就是这样调用它的。

[DllImport("rtl100.bpl", EntryPoint = "@Sysutils@ExtractRelativePath$qqrx17System@AnsiString1", CallingConvention = CallingConvention.Cdecl)]
Internal static extern IntPtr ExtractRelativePath(IntPtr BaseName, IntPtr DestName);

当然,我将使用 thr marshal class 分配和解除分配 intptrs。

问题是,delphi 库真的可以在 c# 中使用吗?它的大部分 API 使用 AnsiString,这是一个原生的 delphi 字符串。或者我们应该开始考虑使用 .net 函数?

谢谢

您有多个问题:

  1. Delphi RTL 使用其他工具链不支持的基于寄存器的调用约定。
  2. AnsiString 是一种 Delphi 特定类型,无法传入和传出其他工具链。
  3. 此特定函数分配调用者必须处理的堆内存。您的 C# 代码无权这样做。

我认为您可能需要重新调整客户的期望。你正在尝试的是不可行的。