• 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

    转载请注明出处:https://www.cnblogs.com/lei-zi/
  • 相关阅读:
    junit4+spring3.0.4.RELEASE测试单元基本实现
    PL/SQL 报错Dynamic Performance Tables not accessible XXX
    Oracle简单建立表空间
    R语言实现统计 plink格式数据位点缺失率
    linux shell实现统计 位点缺失率
    linux shell 统计plink格式样本缺失率
    Rstudio如何设置默认的工作路径
    如何在dos窗口中执行R脚本
    syntax error: unexpected end of file
    R语言如何删除目录下同一类型的文件、或者所有文件
  • 原文地址:https://www.cnblogs.com/lei-zi/p/14369656.html
Copyright © 2020-2023  润新知