2010-02-04 92 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對象。