在 C ++ 中,将'this'指针传递给回调注册方法是很常见的,这样回调就会收到这个指针。我有一个第三方库,我试图与使用此模式的 C#进行互操作。
实施例
typedef HRESULT (WINAPI PFNCALLBACK*)(CALLBACKDATA *data, void *context);
HRESULT SetCallback (PFNCALLBACK *callback, void *context);
我已经为回调函数定义了一个委托:
public delegate int Callback(IntPtr context, CallbackData sample);
并调用SetCallback
函数
void SetupCallback()
{
// My stab at passing the this pointer as context for the callback
IntPtr pThis = GCHandle.ToIntPtr(GCHandle.Alloc(this));
hr = obj.SetCallback(OnCallback, pThis);
}
public static int OnCallback(CallbackData data, IntPtr context)
{
// HOW do I reconstitute the This pointer from the context parameter
}
我的问题是如何将 C#'this'指针传递给SetCallback
方法并在回调函数中重新构建它?
答案 0 :(得分:1)
话虽如此,从理论上说这应该可以通过利用 UnmanagedFunctionPointer属性。
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate int Callback(IntPtr context, CallbackData sample);
然后存储你的代表
static Callback _someCallBack = null;
_someCallBack += new Callback(OnCallback);
最后在调用C代码时传入委托
IntPtr pThis = GCHandle.ToIntPtr(GCHandle.Alloc(this));
hr = obj.SetCallback(_someCallBack, pThis);
我也不认为你真的需要弄乱这个指针,除非你真的需要它在回调老实说我会尝试传入null。在.Net土地上进行编组和编组参考并重新使用它是不安全的。