从C#代码调用Delphi DLL方法

5

我正在尝试从C# ASP.NET代码中调用一个Delphi函数。该函数的声明如下:

function SomeFunction(const someString, SomeOtherString: string): OleVariant;

我有以下C#代码:

[DLLImport(MyDLL.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
public static extern object SomeFunction(string someString, string SomeOtherString);

每次我调用这个方法并将其存储为一个对象时,都会出现P/Invoke错误。我以前从未在C#中调用过非托管代码,所以我有些不知所措。

你遇到了哪个P/Invoke错误?=) - Rob
你需要将你的函数标记为"导出"和"stdcall"至少这两个选项。在你定义该函数被导出的地方展示你的单元代码。 - Vladislav Rastrusny
请参考我几天前在Tek-Tips论坛上写的常见问题解答(点击这里)。 - user545536
2个回答

9
由于该DLL函数使用Delphi特有的string数据类型,而非Embarcadero产品中没有相应的等效类型,因此您无法调用该DLL函数。(即使您的C#代码可以匹配Delphi的string类型的结构,您也需要使用DLL的内存管理器来分配内存,但它几乎肯定不会导出。)
如果您有更改DLL的能力,请使参数具有PAnsiChar或PWideChar类型。(根据您的C#声明,看起来您想要PAnsiChar。)这就是DLL一直以来都应该使用的类型。
如果您无法更改DLL,则在Delphi或C++ Builder中编写一个包装器DLL,该DLL使用PAnsiChar或PWideChar,然后将这些参数转发到原始的Delphi DLL。或者向DLL供应商大声抱怨并请求使用对其他语言更友好的类型的新版本。

0

尝试

[DLLImport(MyDLL.dll, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
public static extern IntPtr SomeFunction(string someString, string SomeOtherString);

使用Marshal.GetObjectForNativeVariant方法并传入返回值,以获取.NET对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接