如何在 C# 中将此指针作为上下文参数传递给回调
How to pass this pointer as context parameter for callback in c#
在 C++ 中,通常将 'this' 指针传递给回调注册方法,以便回调将接收回该指针。我有一个第 3 方库,我正尝试与使用此模式的 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
方法并在回调函数中重构它?
呃,你要求的是互操作的噩梦,尤其是因为你正在处理 "black box" 第三方 DLL。
话虽如此,理论上这应该可以通过利用
UnmanagedFunctionPointer 属性。
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate int Callback(IntPtr context, CallbackData sample);
然后存储你的代表
static Callback _someCallBack = null;
_someCallBack += new Callback(OnCallback);
最后在调用C代码的时候传入delegate
IntPtr pThis = GCHandle.ToIntPtr(GCHandle.Alloc(this));
hr = obj.SetCallback(_someCallBack, pThis);
我也不认为你真的需要弄乱 this 指针,除非你真的在回调中需要它老实说我会尝试传入 null。在 .Net 领域将引用重新编组并重新使用是不安全的。
在 C++ 中,通常将 'this' 指针传递给回调注册方法,以便回调将接收回该指针。我有一个第 3 方库,我正尝试与使用此模式的 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
方法并在回调函数中重构它?
呃,你要求的是互操作的噩梦,尤其是因为你正在处理 "black box" 第三方 DLL。
话虽如此,理论上这应该可以通过利用 UnmanagedFunctionPointer 属性。
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate int Callback(IntPtr context, CallbackData sample);
然后存储你的代表
static Callback _someCallBack = null;
_someCallBack += new Callback(OnCallback);
最后在调用C代码的时候传入delegate
IntPtr pThis = GCHandle.ToIntPtr(GCHandle.Alloc(this));
hr = obj.SetCallback(_someCallBack, pThis);
我也不认为你真的需要弄乱 this 指针,除非你真的在回调中需要它老实说我会尝试传入 null。在 .Net 领域将引用重新编组并重新使用是不安全的。