如何在c#中传递这个指针作为回调的上下文参数
本文关键字:指针 回调 参数 上下文 | 更新日期: 2023-09-27 18:04:06
在 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
方法并在回调函数中重建它?
啊,你这是在自找一个互操作噩梦,尤其是当你在处理一个"黑盒"第三方DLL时。
话虽如此,从理论上讲,这应该是可能的,通过利用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);
我也不认为你真的需要弄乱this指针,除非你真的需要它在回调老实说我会尝试传递null。在。net环境中,对引用进行编组和重新使用是不安全的。