2010-02-04 116 views
5

我想从C#ASP.NET代码调用Delphi函数。该函数的声明如下:从C#代码调用delphi DLL方法

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

+0

您收到的P/Invoke错误是什么? =) – Rob 2010-02-04 14:53:32

+0

您需要将您的函数标记为“export”和“stdcall”作为最小值。显示你的单位代码在哪里定义这个函数被导出。 – 2010-02-04 14:54:08

+0

[请参考我前几天在Tek-Tips论坛上发布的FAQ(Click Me)](http://tek-tips.com/faqs.cfm?fid=7416) – 2010-12-17 01:37:30

回答

9

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

如果您有能力要更改DLL,然后使参数具有类型PAnsiChar或PWideChar。 (从你的C#声明看来,你需要PAnsiChar。)这就是DLL应该一直使用的东西。

如果您不能更改DLL,那么在Delphi或C++ Builder中使用PAnsiChar或PWideChar编写包装DLL,然后将这些参数转发给原始的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对象。