功能在C DLL看起來是這樣的:PInvoke C *中的char *在C#中作爲字符串處理。發行與空字符
int my_Funct(char* input, char* output);
我必須從C#應用程序調用此。我這樣做的方式如下:
...DllImport stuff...
public static extern int my_Funct(string input, string output);
輸入字符串完美傳輸到DLL(我有可見的證據)。函數填充的輸出雖然是錯誤的。我在這六數據,如:
3F-D9-00-01
但不幸的一切,這是兩個零被切斷後,只有前兩個字節來我的C#應用程序。它發生,因爲(我猜)它視爲空字符並將其作爲字符串的結尾。
任何想法我怎麼能擺脫它?我試圖將它指定爲IntPtr而不是字符串,但我不知道該如何處理它。 我試圖做後:
byte[] b1 = new byte[2];
Marshal.Copy(output,b1,0,2);
2應該是正常的字節數組的長度。但是我會遇到各種各樣的錯誤:比如「請求的範圍超出了數組的末尾」。或「嘗試讀取或寫入受保護的內存......」
我欣賞任何幫助。
(1)C#字符串比字符寬;它們的寬度是2個字符而不是1.(2)此函數返回的char *不會具有必需的附加結構以成爲有效的C#字符串(即使它的寬度正確)。 – 2013-03-07 14:41:52
您需要閱讀COM Interop和P/Invoke以瞭解如何執行此操作。做到這一點,並回答您對該材料的任何問題。 – 2013-03-07 14:43:50
pinvoke編組僅支持C字符串。當它具有0之後的字節時,它顯然不是C字符串。它是一個字節[]。但是,如果發生嚴重的掛斷問題,則沒有人能夠確定*很多*字節的相關性。這個函數在C代碼中也很難使用,當你編譯它的時候並沒有什麼好處。你最好修復它。如果長度可預測,請使用MarshalAs.SizeConst。 – 2013-03-07 16:04:27