1、托管類型和非托管類型區別
托管: 指內存管理由系統而不是程序員管理,.net,C#等(自動垃圾回收機制)
非托管:內存由程序員手動釋放,C++
嚴格意義來說,沒有非托管C++,托管只是一種對C++的擴展,如C++/CLI,使用別的辦法也可由系統管理內存。
托管代碼:由CLR(公共語言運行庫)執行的代碼,CLR服務如:自動垃圾回收、運行庫類型檢測、安全支持等。
非托管代碼:由操作系統直接執行的代碼,必須提供自己的垃圾回收、類型檢查、安全支持等。
2、C#調用C++動態庫如何接收C++數據類型為char*
1)C++動態庫方法(此處舉例兩種函數返回值:int 和char*):
cpp文件中:
extern "c" int funcName(char* str, int nLength,char* bt) { char m_buff[100]; ........ //數組操作 memcpy(bt,m_buff,len); //len為m_buff數組的有效長度(可根據需求自己取長度),將數組m_buff賦給bt return len; }
頭文件中:
define DLL_API __declspec(dllexport) extern “C” DLL_API int funcName(char* str,int nLength, char* bt);
2)C#中調用C++動態庫(對應C++動態庫函數返回值int和IntPtr):
a.動態庫方法入口(示例)
[DllImport("DLLTest.dll",EntryPoint="funcName",CallingConvention=CallingConvention.Cdecl,Charset=Charset.Ansi) public static extern int funcName(byte[] strint nLength,,ref byte bt);
b.調用該方法(傳參示例)
byte[] b = new byte[256]; int receivelen = DLLTest.funcName(msg,m_nLength,ref b[0]); //傳入數組b引用地址,使其指向C++動態庫中賦值數組
此時數組b即為調用C++動態庫得到的數組值
本文轉載自:https://blog.csdn.net/qq_22889875/article/details/78624847