【发布时间】:2016-08-25 18:54:30
【问题描述】:
在 C++ 中,通常将“this”指针传递给回调注册方法,以便回调将收到返回的 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 方法并在回调函数中重构它?
【问题讨论】:
-
OnCallback是一个实例方法。已有的this引用有什么问题? -
已修复。 OnCallback 是静态的,因为它没有传递隐式的“this”指针。
-
有道理。当 C 函数所期望的只是指向具有任何调用约定的 C 函数的指针时,不期望 C 函数能够正确调用 .NET 委托。
-
这似乎行得通!