zoukankan      html  css  js  c++  java
  • 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/
  • 相关阅读:
    【刷题】HDU 6183 Color it
    【刷题】HDU 3435 A new Graph Game
    【刷题】HDU 1853 Cyclic Tour
    【刷题】BZOJ 5418 [Noi2018]屠龙勇士
    【刷题】BZOJ 5415 [Noi2018]归程
    【刷题】BZOJ 4636 蒟蒻的数列
    【刷题】BZOJ 4443 [Scoi2015]小凸玩矩阵
    vue_过滤器: 对要显示的数据进行特定格式化后再显示
    vue_过渡_动画
    vue_实例_组件的生命周期
  • 原文地址:https://www.cnblogs.com/lei-zi/p/14369656.html
Copyright © 2011-2022 走看看