C# 在非托管回调函数中接收对象

C# 在非托管回调函数中接收对象,c#,callback,unmanaged,marshalling,C#,Callback,Unmanaged,Marshalling,例如,我想将以下委托方法用作非托管代码的回调函数: public delegate void Callback(IntPtr myObject); Callback callback; 我以以下方式注册: [DllImport("a.dll")] public static void registerCallback(IntPtr callbackFunction, IntPtr anObject); // ... this.myObject = new MyClass(); this

例如,我想将以下委托方法用作非托管代码的回调函数:

public delegate void Callback(IntPtr myObject);

Callback callback;
我以以下方式注册:

[DllImport("a.dll")]
public static void registerCallback(IntPtr callbackFunction, IntPtr anObject); 

// ...

this.myObject = new MyClass();
this.objectPin = GCHandle.Alloc(this.myObject, GCHandleType.Pinned);
registerCallback(Marshal.GetFunctionPointerForDelegate(callback), objectPin.AddrOfPinnedObject());
现在,无论何时调用回调函数,它都将具有MyClass对象的指针/句柄。我可以使用Marshal.PtrToStructure将其转换为MyClass的对象。但是,我希望委托定义已经包含类MyClass。例如:

public delegate void Callback(MyClass myObject);
我试过这个,但不起作用。我还尝试了以下方法,但没有成功:

public delegate void Callback([MarshalAs(UnmanagedType.IUnknown)]MyClass myObject);
我想在这一点上我需要类似于“UnmarshalAs”的东西,但遗憾的是这不可用。有什么建议可以让我在回调函数中丢失该IntPtr并将其打包为一个常规的托管MyClass对象吗?

:


我正要回去告诉你,当我看到你更新的答案时,我发现了一种将GCHandöe转换为IntPtr的方法,反之亦然。非常感谢,先生:)
void MyCallback(IntPtr anObject)
{
    GCHandle gch = GCHandle.FromIntPtr(anObject);
    MyClass myObject = (MyClass)gch.Target;
}