1、C语言定义个回调函数的注册
typedef void(__stdcall *test_callback)(int* array, int size);
__declspec(dllexport) int register_test_callback(test_callback cb);
2、在C#中调用如:
[DllImport("Test.dll",ChartSet.Ansi,EntryPoint="register_test_callback",ExactSpelling=false,CallingConvertion=CallingConvertion.StdCall)]
private static extern void Test(CallbackDelegate callback);
3、接下来定义一个委托:
// 不使用如下修饰,会导致C#在调用完后,释放pData内容,导致C程序崩溃;所以在声明代理的时候,说明是C回调,不会收里面资源
[System.Runtime.InteropServices.UnmanagedFunctionPointerAttribute(System.Runtime.InteropServices.CallingConvention.Cdecl)]
public delegate void CallbackDelegate([MarshalAs(UnmanagedType.LPArray,SizeConst=1024)]int[] array, int size);
public static CallbackDelegate callback;
注:说明一下,在给C传入数组参数时,必须得用[MarshalAs(UnmanagedType.LPArray,SizeConst=1024)] 修饰,即告诉C,C#传入的是一个长度为1024的数组类型,如果不修饰,回调函数接收到的参数将只有一条数据。
4、在调用时,先写一个接受C传回参数的方法,即传入委托的实现方法。
private void CallBackFunction([MarshalAs(UnmanagedType.LPArray,SizeConst=1024)]int[] array, int size)
{
...//处理C传过来的数据
}
5、使用
public void GetData()
{
callback=CallBackFunction;
register_test_callback(callback);
}