2010-11-06 33 views
1

我有C++ dll的類,我想從C#代碼發送字符串,surly我不能使用字符串,因爲CLR,我會努力將字符串更改爲C++ dll中的字符,並且從c#發送字節(因爲在c#中的c + +字節=字節),但c#不理解c + +數組我可以發送1字節,它會好的,但不是數組,請幫助! DLL代碼:在C#中使用C++代碼

public ref class Coding 
    { 
    public: 
     void HillCoding(char filePath[]) 
     { 

      ... 
     } 
    }; 
+0

你可以與我們分享C++函數的簽名嗎? – Raphael 2010-11-06 21:17:26

+1

在'P/Invoke'的運行時,CLR會將'string'轉換爲'char *'我相信 – 2010-11-06 21:17:51

+0

[將非空終止的字符串傳遞給非託管代碼](http://stackoverflow.com/questions/ 3435163/passing-non-null-terminated-strings-to-unmanaged-code) – Hogan 2010-11-06 21:18:48

回答

1

下面是從C#調用C++ DLL函數的工作代碼:

sbyte[] A_SB_array = new sbyte[0]; 
    ArrayConvCtoSB(ref A_SB_array, ar_param.ToCharArray()); 
    fixed (sbyte* SB_array = A_SB_array) 
     return CPSFEW.getDataLength(SB_array); 

這不是「很好的代碼」,但它說明了你需要。 PS:這裏是ArrayConvCtoSB。我不喜歡它,只是爲了理解。

static private void ArrayConvCtoSB(ref sbyte[] to_sbyte, char[] from_char) 
    { 
     for (int i = 0; i < from_char.Length; i++) 
     { 
      Array.Resize(ref to_sbyte, to_sbyte.Length + 1); 
      to_sbyte[i] = (sbyte)from_char[i]; 
     } 
    } 

PPS:「固定的」強烈需要forceing垃圾收集器不以清除SB_array存儲器:否則它可以。 :)

+0

另外還有一個。這裏是getDataLength C++函數的聲明:「size_t getDataLength(const char * param){...}」 – Badiboy 2010-11-06 21:52:08

+0

它解決了問題,thx man;) – ZAA 2010-11-06 22:27:41

1

試試這個第一,因爲CLR轉換stringchar *,NO 4

callThisCPlusPlusMethod(myString) 

如果不行,用

char[] sendArray = myString.ToCharArray(); 
callThisCPlusPlusMethod(sendArray); 

或者,如果需要不同的編碼:

byte[] sendArray = Encoding.TheEncodingINeed.GetBytes(myString); 
callThisCPlusPlusMethod(sendArray); 

注: 我傾向於喜歡曖昧的名字:)

+0

錯誤參數1:無法從'string'轉換爲'std.basic_string ,std :: allocator > *' – ZAA 2010-11-06 21:39:03

+0

如果你的簽名與上面的簽名相同,那麼理論上應該工作,我不知道問題會是什麼......你嘗試了我發佈的所有其他方法嗎? – 2010-11-06 21:41:09