C# 调用 c++ dll

C# 调用 c++ dll

首先 c++ 库 dll 要定义

  • 代码中定义 CPP_EXPORTS

    #ifdef LASERSDK_EXPORTS
    #define CPP_EXPORTS __declspec(dllexport)
    #else
    #define CPP_EXPORTS __declspec(dllimport)
    #endif

  • 编译器定义

LASERSDK_EXPORTS

普通函数

  • c++

    extern "C" CPP_EXPORTS int __stdcall Add(int n1, int n2);

    int __stdcall Add(int n1, int n2)
    {
    return n1 + n2;
    }

  • c#

    [DllImport("SampleCppWrapper.dll", CallingConvention = CallingConvention.StdCall)]
    public static extern int Add(int n1, int n2);

    // 使用
    int res = Add(1, 1);

结构体

  • c++

    struct Vector4
    {
    float A, B, C;
    const char* D = nullptr;
    };

    extern "C" CPP_EXPORTS Vector4 __stdcall Add2(int n1, int n2);
    extern "C" __declspec(dllexport) void __stdcall Add5(Vector4 vec);

    // 结构体指针
    // c++ 开启的内存,c++ 回收 Add7_Clear
    extern "C" __declspec(dllexport) Vector4* __stdcall Add7();
    extern "C" __declspec(dllexport) void __stdcall Add7_Clear(Vector4* vc);

    // cpp
    Vector4 __stdcall Add2(int n1, int n2)
    {
    Vector4 sd;
    sd.A = 12;
    sd.B = 13;
    sd.D = "asdfssssws";
    return sd;
    }

    void __stdcall Add5(Vector4 vec)
    {
    printf("\n Add5:: \n");

    复制代码
      printf("%f ,", vec.A);
      printf("%s ,", vec.D);
    
      printf("\n");

    }

    Vector4* __stdcall Add7()
    {
    Vector4* vec = new Vector4();
    vec->A = 1212;
    vec->D = new char[10000];
    return vec;
    }

    void __stdcall Add7_Clear(Vector4* vc)
    {
    if (vc)
    {
    if (vc->D)
    {
    delete vc->D;
    }
    delete vc;
    }
    }

  • c#

    [DllImport("SampleCppWrapper.dll", CallingConvention = CallingConvention.StdCall)]
    public static extern Vector4 Add2(int n1, int n2);

    [DllImport("SampleCppWrapper.dll", CallingConvention = CallingConvention.StdCall)]
    public static extern void Add5(Vector4 vec);

    [DllImport("SampleCppWrapper.dll", CallingConvention = CallingConvention.StdCall)]
    public static extern IntPtr Add7();
    [DllImport("SampleCppWrapper.dll", CallingConvention = CallingConvention.StdCall)]
    public static extern void Add7_Clear(IntPtr vc);

    // 使用
    Vector4 sd = Add2(1, 1);
    string s = Marshal.PtrToStringAnsi(sd.D);
    Console.WriteLine("asdfasdfasdf : " + s);

    Vector4 _vec = new Vector4();
    _vec.A = 123;
    _vec.D = Marshal.StringToHGlobalAnsi("dddddddddsdsdsdsdsbsbsbsbsbsbsb");

    Add5(_vec);
    Marshal.FreeHGlobal(_vec.D);

    IntPtr add7 = Add7();

    Vector4 _vec7 = (Vector4)Marshal.PtrToStructure(add7, typeof(Vector4));
    Console.WriteLine(_vec7.A);

    Add7_Clear(add7);

数组

  • c++

    extern "C" CPP_EXPORTS int __stdcall arraytest(float* vals, int len);

    int __stdcall arraytest(float* vals, int len)
    {

    复制代码
      for (int i = 0; i < len; i++)
      {
          vals[i] = i;
      }
      return 0;

    }

  • c#

    [DllImport("SampleCppWrapper.dll", CallingConvention = CallingConvention.StdCall)]
    public static extern int arraytest( float[] datas,int len);

    // use

    float[] one_outlines = new float[1024];
    int res = arraytest(one_outlines, 1024);

回调函数

  • c++

    typedef void (callback_outline)(int, float, int);
    extern "C" CPP_EXPORTS void __stdcall laser_set_callback_outline_handle(callback_outline cb);

    callback_outline _callback_outline;
    float vals[1024];

    void __stdcall laser_set_callback_outline_handle(callback_outline cb)
    {
    _callback_outline = cb;

    复制代码
      printf("laser_set_callback_outline_handle suc \n");
    
      if (_callback_outline)
      {
      	_callback_outline(1, vals, 1024);
      }

    }

  • c#

    // 映射c++函数
    [DllImport("SampleCppWrapper.dll", CallingConvention = CallingConvention.StdCall)]
    public static extern void laser_set_callback_outline_handle(CallbackOutlineDelegate call);

    // 创建委托
    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    public delegate void CallbackOutlineDelegate(int handle, [MarshalAs(UnmanagedType.LPArray, SizeConst = 1024)] float[] ydata, int len);

    // use

    // 回调函数
    public static void CallbackOutlineFunc(int handle, [MarshalAs(UnmanagedType.LPArray, SizeConst = 1024)] float[] ydata, int len)
    {

    }

    static LaserSdk.CallbackOutlineDelegate outlineDelegate;
    static void Main1(string[] args)
    {
    outlineDelegate = new LaserSdk.CallbackOutlineDelegate(CallbackOutlineFunc);
    laser_set_callback_outline_handle(outlineDelegate);

    }

相关推荐
王维志22 分钟前
LiteDB详解
数据库·后端·mongodb·sqlite·c#·json·database
Humbunklung27 分钟前
unordered_map使用MFC的CString作为键值遇到C2056和C2064错误
c++·stl·mfc
We....29 分钟前
Java分布式编程:RMI机制
java·开发语言·分布式
€81137 分钟前
Java入门级教程17——利用Java SPI机制制作验证码、利用Java RMI机制实现分布式登录验证系统
java·开发语言·java spi机制·远程传输数据
2301_8153577043 分钟前
parameterType和@Param注解的区别
java·开发语言·数据库
tyatyatya1 小时前
MATLAB中进行视觉检测入门教程
开发语言·matlab·视觉检测
程序猿多布1 小时前
XLua教程之热补丁技术
unity·c#·lua·xlua
2401_845417451 小时前
set和map
java·开发语言
2301_821046521 小时前
Python的深度学习
开发语言·javascript·ecmascript
爱编程的化学家1 小时前
代码随想录算法训练营第十一天--二叉树2 || 226.翻转二叉树 / 101.对称二叉树 / 104.二叉树的最大深度 / 111.二叉树的最小深度
数据结构·c++·算法·leetcode·二叉树·代码随想录