2014-09-05 134 views
0

我嘗試調用C#中用C編寫的dll方法。調用C DLL中的方法失敗

這是C方法:

​​

這也是我嘗試調用它的方式。

[DllImport(EntryPoint = "c_ata", CallingConvention = CallingConvention.Cdecl)] 
private static extern string cAta(byte[] c, long c_len, byte[] b, long b_len); 

問題是我沒有得到任何錯誤,當我嘗試運行或調試我的NUnit測試。

我不是很熟悉C語法,所以問題是?我的電話語法是否正確(理論上)?

+0

size_t參數需要是IntPtr。字符串返回值也需要是IntPtr,否則編組人員會試圖銷燬字符串。這是非常少見的,C代碼通常不會使用CoTaskMemAlloc()來分配可以在另一個模塊中安全釋放的內存。這很可能是不可避免的內存泄漏。使用Marshal.PtrToStringAnsi()轉換IntPtr。編寫一個測試程序,數百萬次調用該函數,觀察內存使用情況。 – 2014-09-05 23:19:11

回答

0

在C#中,long指定一個64位整數。 C代碼中的size_t是64位嗎?如果不是,PInvoke簽名應該改爲使用int而不是long。

如果聲明一個PInvoke簽名以返回一個字符串,則編組器將從返回的指針創建一個字符串,然後在指針上調用CoTaskMemFree。這隻適用於指針最初分配給CoTaskMemAlloc的情況。如果本地端自己清理內存,則應該聲明PInvoke返回一個IntPtr,然後您可以使用Marshal.PtrToStringAnsi或等價物創建一個字符串。

+0

謝謝你,Marshal.PtrToStringAnsi已經做到了 – user4013391 2014-09-06 06:55:01