我正在尝试迁移一个用 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 函数?
谢谢
最佳答案
你有多个问题:
- Delphi RTL 使用其他工具链不支持的基于寄存器的调用约定。
AnsiString
是 Delphi 特定的类型,不能传入和传出其他工具链。- 此特定函数分配调用者必须释放的堆内存。您的 C# 代码无权这样做。
我认为您可能需要重新调整客户的期望。你正在尝试的是不可行的。
关于c# - Delphi DLL 可以在 C# 中调用和使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43798535/