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);// usefloat[] 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);}