目前知道的狀況被調用的C/C++函數只能是全局函數 不能調用類中的成員方法css
被調用的C函數必須使用extern 「C「包含,保證採用的導出函數名生成規則和.NET一致html
函數調用約定一般使用WINAPI也就是__stdcall,.net默認也是__stdcallc++
.net能夠和c++同時用cdecl調用約定,這樣能夠支持可變參數個數函數
c函數必須使用__declspec(dllexport)前綴來導出工具
PInvoke assistant工具能夠輔助生成C#和VB的引入聲明,還能夠查看常見的常量枚舉post
可否調用重載的c++函數導出尚未試驗,目前找到的信息看仍是不行url
字符串只支持C裏的char* w_char* 不支持stl的string.net
各類指針句柄均可以使用C#的IntPtr UIntPtr來對應指針
向非託管的C傳遞字符串若是是經過變量 能夠用Marshal.StringToHGlobalAuto(csstr)獲得複製到非託管內存的字符串IntPtr句柄,而後能夠IntPtr.ToInt32()或者IntPtr.ToInt64()方法轉成int傳遞給PInvok方式聲明的C函數調用。這個字符串的非託管副本用完以後記得在C#使用Marshal.FreeHGlobal(cstrAddr)來釋放掉。htm
參考文章:
C# 託管內存與非託管內存之間的轉換 https://blog.csdn.net/menjiawan/article/details/48734015
C#與C++與互操做 http://www.javashuo.com/article/p-tbughycf-eh.html