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限制。