c#呼び出しc++コールバック関数メソッドの実装
2622 ワード
c++にはコールバック関数ポインタの概念があり、ある関数がタイマ関数を呼び出すときに1つの関数ポインタに伝わるだけで目的を達成できますが、C#には関数ポインタの概念がありません.どうすれば実現できますか.
コールバック関数といえば,c#の依頼が考えられるはずで,名前は異なるが,それぞれの言語の範疇で似たような機能を実現できる.だから私たちは大胆に試して、c#の中の依頼をc++に伝えて、c++がそれがコールバック関数であることを認めることができるかどうかを見ることができます.
まずc++でコールバック関数付きメソッドTestを書き,ここでは省略する.
次に、c#で次のように呼び出します.
次に、依頼を定義します.
注意:説明すると、c++に配列パラメータを入力する場合は、[marshalAs(UnmanagedType.LPArray,SizeConst=8010)]で処理しなければなりません.それに相当して、c+、c#に入力されるのは長さ8010の配列タイプで、この文を書かないと、受信したパラメータは1つのデータしかありません.
次に、呼び出す方法を見てみましょう.
呼び出し時に、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の配列タイプで、この文を書かないと、受信したパラメータは1つのデータしかありません.
次に、呼び出す方法を見てみましょう.
呼び出し時に、c++呼び出しパラメータを受け入れる方法、すなわち、依頼を伝える実装方法を書かなければなりません.
private void CallBackFunction([marshalAs(UnmanagedType.LPArray,SizeConst=8010)]byte[] buffer,int count)
{
...// c++ s
}
すべての仕事の準備が終わったら、最後の操作をします.
public void GetData()
{
callback=CallBackFunction;
ReadMyVideo("",callback);
}
検証の結果,依頼はc++のコールバック関数である.