C#调用C带回调函数方法的实现

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

你可能感兴趣的:(C语言)