我有原生C++ dll函數,可以找到連接到計算機的攝像頭數量並返回它們的序列號。我試圖在C#應用程序中使用本機C++ DLL,但我不斷收到訪問衝突錯誤(試圖讀取或寫入受保護的內存)。C#中的原生C++ dll問題#
有問題的功能是
uint32_t GetSerialNumList(char** theBufList, int theBufSize, int theListLength);
我使用的PInvoke的方法如下:
[DllImport(CameraDll, EntryPoint = "GetSerialNumList", CallingConvention = CallingConvention.Cdecl)]
private static extern uint GetSerialNumList(out byte[] pBuf, int BufSize, int ListLength);
如果我創建本地的C++應用程序使用的DLL和使用功能如下:
char* theSerialNumb;
theSerialNumb = (char *) malloc(sizeof(char)* 8);
status = TRI_GetSerialNumList(&theSerialNumb, 8, 1);
它工作正常但是,如果我在C#中使用它如下給我上面提到的錯誤:
byte[] BufList;
BufList = new byte[8];
rv = GetSerialNumList(out BufList, 8, 1);
爲什麼在你的'C++'的例子中你需要調用'malloc'?您無論如何都將指針的地址傳遞給'TRI_GetSerialNumList',這意味着此函數將負責將指針指向適當的內存。看起來像一個內存泄漏給我。 – PaulMcKenzie
這是我的第一個想法,但TRI_GetSerialNumList沒有做分配。如果我沒有分配地址傳遞指針的地址,它會給訪問衝突錯誤寫入位置。 –
幻數'8'來自'malloc'的調用?那麼C#程序應該如何取消分配這個內存(即使你的程序正常工作)呢?至於API崩潰,如果您需要使用神奇的數字來分配,則寫得很差,更不用說分配了。這是記錄的嗎?將指針指向指針的函數幾乎毫無例外,它們負責獲取指針並初始化該指針,並且不期望指向某處的指針有效(因爲該函數將指向某處有效)。 – PaulMcKenzie