C#调用C++动态库如何接收C++数据类型为char*

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

posted @ 2021-02-03 20:48  *雷子*  阅读(1833)  评论(0编辑  收藏  举报