从C#Code调用delphi DLL方法

时间:2010-02-04 14:50:14

标签: c# .net delphi dll

我试图用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#调用非托管代码,所以我有点不知所措。

2 个答案:

答案 0 :(得分:9)

你不能调用那个 DLL函数,因为它使用特定于Delphi的string数据类型,它在非Embarcadero产品中没有等价物。 (即使你的C#代码可以匹配Delphi字符串类型的结构,你也需要使用DLL的内存管理器来分配内存,它几乎肯定不会导出。)

如果您能够更改DLL,则使参数具有类型PAnsiChar或PWideChar。 (根据你的C#声明,看起来你想要PAnsiChar。)这就是DLL应该一直使用的。

如果你不能更改DLL,那么在Delphi或C ++ Builder中编写一个使用PAnsiChar或PWideChar的包装DLL,然后将这些参数转发到原始的Delphi DLL。或者向DLL供应商大声抱怨并请求使用对其他语言更友好的类型的新版本。

答案 1 :(得分:0)

尝试

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

并使用带有返回值的Marshal.GetObjectForNativeVariant来获取.NET对象。