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

    }

相关推荐
爱上语文1 分钟前
Springboot的三层架构
java·开发语言·spring boot·后端·spring
编程零零七2 小时前
Python数据分析工具(三):pymssql的用法
开发语言·前端·数据库·python·oracle·数据分析·pymssql
2401_858286113 小时前
52.【C语言】 字符函数和字符串函数(strcat函数)
c语言·开发语言
铁松溜达py3 小时前
编译器/工具链环境:GCC vs LLVM/Clang,MSVCRT vs UCRT
开发语言·网络
everyStudy3 小时前
JavaScript如何判断输入的是空格
开发语言·javascript·ecmascript
C-SDN花园GGbond5 小时前
【探索数据结构与算法】插入排序:原理、实现与分析(图文详解)
c语言·开发语言·数据结构·排序算法
迷迭所归处6 小时前
C++ —— 关于vector
开发语言·c++·算法
架构文摘JGWZ6 小时前
Java 23 的12 个新特性!!
java·开发语言·学习
leon6256 小时前
优化算法(一)—遗传算法(Genetic Algorithm)附MATLAB程序
开发语言·算法·matlab
CV工程师小林6 小时前
【算法】BFS 系列之边权为 1 的最短路问题
数据结构·c++·算法·leetcode·宽度优先