[英]how to marshal c++ array to c# via IntPtr
考慮以下設置:具有C ++庫的c#應用程序。 c#元素是通過回調從c ++填充的。 在C#端回調的定義如下:
void callbackTester(IntPtr pData, UInt32 length)
{
int[] data = new int[length];
Marshal.Copy(pData, data, (int)0, (int)length);
//using data.. on c#
}
現在,在c ++方面,回調的定義如下:
typedef void (__stdcall *func)(uint8_t* pdata, uint32_t length);
和C ++使用這樣的回調:
void onData()
{
std::vector<uint8_t> dataToCallback;
// fill in dataToCallback
_callback(&(dataToCallback[0]), dataToCallback.size());
// where _callback is a pointer to that c# function
}
我的任務:使用回調從C ++端在C#端獲取數組。
因此,當c ++對象調用onData()函數時,它將從c#調用我的回調。 到現在為止還挺好。 我已經制作了一個使用此功能的c ++測試程序,並且我在回調端正確接收了數組。 如果我在C#測試儀上使用它,我會收到廢話。
例如:如果我正在發送{1,1}的uint8_t數組,我將為c ++測試器獲得{1,1},並且在c#端得到{0xfeeeabab,0xfeeefeee} ...顯然,uint8_t *之間的轉換C ++指針和IntPtr C#工作不按我的預期。
有什么建議么? 非常感謝。
問題似乎是C ++ uint8_t
是無符號字節,而C# int
是有符號4字節整數。 因此,您有一個簡單的類型不匹配。 與uint8_t
匹配的C#類型為byte
。
您的回調應為:
void callbackTester(IntPtr pData, uint length)
{
byte[] data = new byte[length];
Marshal.Copy(pData, data, 0, (int)length);
}
要檢查的一件事是,在C#端,您期望每個元素為int-4個字節(“ int []數據”),但是在C ++上,您僅為每個元素分配uint8-1個字節。
調整分配或長度使用情況,您可能會遇到訪問沖突,這就是為什么看到魔術字節的原因[1]。
[1] http://en.wikipedia.org/wiki/Magic_number_(編程)#Magic_debug_values
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.