如何在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方法并在回调函数中重建它?

如何在c#中传递这个指针作为回调的上下文参数

啊,你这是在自找一个互操作噩梦,尤其是当你在处理一个"黑盒"第三方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环境中,对引用进行编组和重新使用是不安全的。