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


}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值