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

标签 c# c++ delphi interop pinvoke

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

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

这是来自 rtl100.bpl 的函数原型(prototype)

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 类分配和解除分配 intptrs。

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

谢谢

最佳答案

你有多个问题:

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

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

关于c# - Delphi DLL 可以在 C# 中调用和使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43798535/

相关文章:

c# - 将 WriteableBitmap 转换为字节数组 - Windows phone 8.1 - Silverlight

c# - .NET 程序集的延迟签名有什么意义?

c# - 如何获得从对象到空间映射的距离

c++ - Base dtor 应该有一个定义吗?

delphi - AtomicCmpExchange 在所有平台上都可靠吗?

c# - UPX最好的压缩方式是什么

c# - Caliburn ShowDialog 和 MessageBox

c++ - C++ 链接是否足够聪明,可以避免链接未使用的库?

c++ - C++ 中 bool 函数没有引用参数?

delphi - 用 Delphi 捕获 HTML POST?