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