これがあなたが探しているものかどうかは 100% わかりません。
私たちの場合、コールバック メッセージ用のいくつかのフックを提供するサード パーティの C Sdk があります。コールバック呼び出しは C コードで開始され、C 関数を呼び出すことを想定していますが、次の手順を使用して C# メソッドにフックすることができます。(このコードは古いものであり、C# の新しいイテレーションで同じことを達成するためのより簡潔で最新の方法がある可能性があります)。
最初に、C# クラス内でCallback delegateを宣言します。これは、SDK が想定している C 関数ポインターのシグネチャと互換性があります。
たとえば、C コードが次のシグネチャを持つ関数をコールバックすることを想定している場合:
void DecCallBack(int nPort, void* pBuf, int nSize, FRAME_INFO *pInfo, int nReserved1, int reserved 2);
対応する C# デリゲートの定義を次に示します。UnmanagedFunctionPointer
属性のおかげで「魔法」が発生することに注意してください。
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
delegate void DecCallBack(int nPort, IntPtr pBuf, int nSize, ref FRAME_INFO frameInfo, int nReserved1, int nReserved2);
これを取得したら、クラスでDecCallBack
デリゲート インスタンスを保持する型のクラス メンバーを宣言します。
static DecCallBack _decodeCallBack = null;
次に、デリゲート シグネチャと互換性のあるハンドラー メソッドをコーディングします。この場合、名前を付けますHandleDecData()
private static void HandleDecData(int nPort, IntPtr pBuf, int nSize, ref FRAME_INFO frameInfo, int nReserved1, int nReserved2) {
// Here we handle the callback, this code is being called from an external C library
}
次に、C# クラスのどこかで、デリゲート メンバーを初期化し、コールバック Handler をフックする必要があります (この場合は静的メソッドです)。HandleDecData()
_decodeCallBack += new DecCallBack(HandleDecData);
最後に、C への関数ポインターであるかのようにデリゲート メンバーを渡します。この場合、サード パーティの SDK にはPlayM4_SetDecCallBack()
、コールバックが呼び出されたときに関数ポインターが呼び出されることを期待する C 関数があります。デリゲート メンバーを安全に渡すことができます。代わりに私たちのクラス。
if( !PlayM4_SetDecCallBack(channel, _decodeCallBack) )
throw new InvalidOperationException("Error setting DecCallBack");
これがお役に立てば幸いです。