如何在 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 领域将引用重新编组并重新使用是不安全的。