1. 程式人生 > >C#呼叫C帶回調函式方法的實現

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