C#呼叫C帶回調函式方法的實現
阿新 • • 發佈:2018-12-30
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);
}