我正在C++/CLI中編寫一個包裝C DLL的包裝,以便它可以通過託管程序集在C#中訪問。使用直接P/Invoke通過C#訪問C函數是不可能的,因爲C DLL會引發使用P/Invoke無法正確捕獲的異常(在跨C/C#邊界移動時異常消息會丟失)。所以我們的想法是創建一個託管CLI DLL,它在內部調用C DLL並將異常封裝到CLI的Exception類中。C++/CLI雙指針類型轉換爲引用IntPtr的C#訪問
所以C DLL函數有這個聲明。
void InitDB(void **handle);
的C#應用程序將需要進行以下聲明
void InitDB_cs(ref IntPtr handle);
要做到這一點,我創建C++/CLI函數聲明如下
void InitDB_clr(IntPtr %handle);
但是,我不能強制轉換REF InPtr成C功能。我嘗試使用下面的代碼,但似乎無法得到類型轉換的權利。對於上面的代碼
error C2440: 'initializing' : cannot convert from 'void *' to 'cli::pin_ptr<Type>'
1> with
1> [
1> Type=System::IntPtr
1> ]
1> Conversion from 'void*' to pointer to non-'void' requires an explicit cast
1>error C2664: 'InitDB' : cannot convert parameter 1 from 'cli::pin_ptr<Type> *' to 'void **'
1> with
1> [
1> Type=System::IntPtr
1> ]
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
誰是Init()? –
抱歉打字錯誤。它的InitDB(C DLL函數)。感謝您提醒我注意。 –
沒有問題。我不知道CLI,但是錯誤是什麼?如果您將'&ptr'強制轉換爲'void **',會有幫助嗎? –