2017-02-14 38 views
0

我傳遞一個byte[]從C#到C++ DLL傳字節數組C++ DLL爲char *

裏面的C++ DLL,我需要調用接受和讀取istream對象的功能,我打算接收所述byte[]從C#作爲char*並將其轉換爲istream

C++ DLL

extern "C" _declspec(dllexport) bool CheckData(char* data, int dataLength) 

C#

[DllImport("example.dll", CallingConvention = CallingConvention.Cdecl)] 
public static extern bool CheckData(byte[] incoming, int size); 

public void Process(byte[] bytes) 
{ 
    CheckData(bytes, bytes.Length); 
} 

雖然它似乎做工精細,我發現的byte[]等效數據類型是C++ unsigned char*,我想改變爲unsigned char*,但大多數stream在C++工程對char*沒有unsigned char*

我想請問

1)數據類型char*unsigned char*都是1個字節,後面發生了什麼?如果我繼續使用byte[]char*,是否有任何潛在的問題?

2)如有任何問題,應如何使用unsigned char*來構造istream對象?

+1

沒問題,因爲你有它。 –

+0

你知道後面發生了什麼嗎?我想了解發生了什麼 –

+1

沒有什麼事情發生。實際上有一個reinterp演員。 –

回答

1

實際上,char *unsigned char *類型的大小不是1字節,而是4字節,假設我們談論的是win32應用程序:那些是指針,所有指針的大小都是相同的,而不管數據大小被指出。

當P/Invoke機制將「簡單值」數組看作函數參數時,它會愉快地將一個指向數組開頭的指針提供給下面的C函數。畢竟,所有它真的知道從DLL中的信息的C函數是其代碼啓動的地方。據我所知,參數的數量和類型不會在符號名稱中編碼,因此它信任您提供的信息。這意味着,即使你給它一個int數組,實際對C函數的調用也會奏效,因爲堆棧中的參數大小(指針和int)與函數的ABI相匹配。當然,處理可能是錯誤的,因爲尺寸不匹配。

另請參閱https://msdn.microsoft.com/en-us/library/75dwhxf7(v=vs.110).aspx瞭解有關發生的更多細節。

處理就是unsigned charchar之間的區別來了:如果在C#大小,你做一些數學上的byte值(範圍0-255),通過它的C面,其中char值(-128〜127)預計 做更多的數學,可能會出錯。如果它只是將它用作移動數據的方式,那一切都很好。