可以在C#中使用Delphi DLL并使用它吗?

时间:2017-05-05 07:02:53

标签: c# c++ delphi interop pinvoke

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

我试图将具有AnsiString作为返回和参数的rtl100.bpl的ExtractRelativePath函数设为pinvoke。然后我使用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类分配和释放intptrs。

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

由于

1 个答案:

答案 0 :(得分:3)

您有多个问题:

  1. Delphi RTL使用其他工具链不支持的基于寄存器的调用约定。
  2. AnsiString是Delphi特定类型,无法传递到其他工具链或从其他工具链传递。
  3. 此特定函数分配调用者必须处理的堆内存。您的C#代码无法执行此操作。
  4. 我认为您可能需要重新调整客户的期望。你所尝试的是不可行的。