我正在尝试将 C# 回调函数传递给本机 dll。它工作正常,但我找不到访问回调方法的父对象的方法。这是一个演示我想要做什么的代码:
class MyForm: Form {
public delegate void CallbackDelegate(IntPtr thisPtr);
[DllImport("mylib.dll", CallingConvention = CallingConvention.StdCall)]
public static extern void Test(CallbackDelegate callback);
int Field;
static void Callback(IntPtr thisPtr)
{
// I need to reference class field Field here.
MyForm thisObject = ?MagicMethod?(thisPtr);
thisObject.Field = 10;
}
void CallExternalMethod()
{
Test(Callback);
}
}
我尝试获取指针,this
但出现以下异常:“对象包含非原始或非 blittable 数据。”。我可能应该提到父对象是一个 WindowsForms 表单。
更新
该dll是用Delphi编写的,Test函数的签名如下:
type
TCallback = procedure of object; stdcall;
procedure Test(Callback: TCallback); stdcall;
当我尝试使用以下代码获取指向类的指针时收到上述错误消息:
var ptr = GCHandle.Alloc(this, GCHandleType.Pinned).AddrOfPinnedObject();