C#和C++混合程式設計的一些tips

語言: CN / TW / HK

最近幫朋友寫個小東西的時候,剛好用到了C#和C++的混合程式設計,記錄一些tips供日後參考。

首先說明下環境:C#呼叫C++的庫函式,C++建立一個非託管類庫專案,C#專案引用之。

1.C++類庫中的tips

C++類庫中匯出函式的宣告如下:

extern "C" __declspec(dllexport) int* Detect(char* data,int width,int height);

需要注意的是:

要使用 extern " C " 標明,否則C#呼叫時會找不到方法名;其次要使用__declspec(dllexport)標明為匯出函式。

2.C#呼叫的tips

C#呼叫時,首先需要宣告外部方法的簽名,如下:

[DllImport("DetectDll.dll", CallingConvention = CallingConvention.Winapi)]
public extern static void Detect ([MarshalAsUnmanagedType.LPArray,SizeConst=8]byte[] bp,int w,int h,[MarshalAsUnmanagedType.LPArray,SizeConst=4]int[] result);

需要注意的是:

指明CallingConvention為Winapi型別;

對於陣列型別需要指明MarshalAs的方式,一般的定長陣列或下標有上限的,都可以用LPArray來Marshal。

3.其它

呼叫非託管程式碼需要使用unsafe關鍵字,對於指標需要進行fixed限制。