簡體   English   中英

如何通過IntPtr將C ++數組編組為C#

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM