在c++中有個回調函數指針的概念,只需要某個函數在調用定時器函數時傳入一個函數指針就能達到目的,但C#中沒有函數指針的概念,我們該怎樣來實現呢。
其實說到回調函數,大家應該能想到c#中的委托,雖然名字不一樣,但在各自的語言范疇都能實現相似的功能。所以我們就可以大膽的嘗試下,把c#中的委托傳給c++,看c++是否能夠承認它就是回調函數。
首先用c++寫一個帶有回調函數的方法 Test,在此省略。
接著,在c#中調用,如:
[DllImport("Test.dll",ChartSet.Ansi,EntryPoint="ReadMyVideo",ExactSpelling=false,CallingConvertion=CallingConvertion.StdCall)]
private static extern void Test(string fileName,CallbackDelegate callback);
接下來我們再定義一個委托:
public delegate void CallbackDelegate([marshalAs(UnmanagedType.LPArray,SizeConst=8010)]byte[] buffer,int count);
public static CallbackDelegate callback;
注:說明一下,在給c++傳入數組參數時,必須得用[marshalAs(UnmanagedType.LPArray,SizeConst=8010)] 處理一下,相當於是告訴c++,c#傳入的是一個長度為8010的數組類型,如果不寫這句話的話,你回調函數接收到的參數將只有一條數據。
接下來看看怎樣來調用:
在調用時,我們得先寫一個接受c++傳回參數的方法,即我們傳入委托的實現方法。
private void CallBackFunction([marshalAs(UnmanagedType.LPArray,SizeConst=8010)]byte[] buffer,int count)
{
...//處理c++傳過來的數據s
}
一切工作准備完畢之後,我們來進行最後一步操作把
public void GetData()
{
callback=CallBackFunction;
ReadMyVideo("",callback);
}
經過驗證,委托就是c++要的回調函數。