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);

    }

相关推荐
遇见~未来5 分钟前
JavaScript构造函数与Class终极指南
开发语言·javascript·原型模式
weixin_461769409 分钟前
15. 三数之和
c++·算法·leetcode·三数之和
foundbug99916 分钟前
基于MATLAB的TDMP-LDPC译码器模型构建、仿真验证及定点实现
开发语言·matlab
X***078830 分钟前
从语言演进到工程实践全面解析C++在现代软件开发中的设计思想性能优势与长期生命力
java·开发语言
毕设源码-钟学长1 小时前
【开题答辩全过程】以 基于Python的车辆管理系统为例,包含答辩的问题和答案
开发语言·python
CCPC不拿奖不改名1 小时前
数据处理与分析:数据可视化的面试习题
开发语言·python·信息可视化·面试·职场和发展
液态不合群1 小时前
线程池和高并发
开发语言·python
小镇学者1 小时前
【c++】C++字符串删除末尾字符的三种实现方法
java·开发语言·c++
SmartRadio1 小时前
在CH585M代码中如何精细化配置PMU(电源管理单元)和RAM保留
linux·c语言·开发语言·人工智能·单片机·嵌入式硬件·lora
ue星空2 小时前
R3注入反截图
c++