C#經過PInvoke調用c++函數的備忘錄

目前知道的狀況被調用的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

相關文章
相關標籤/搜索