EG。我有以下委托方法,我想用作非托管代码的回调函数:
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对象?
答案 0 :(得分:2)
void MyCallback(IntPtr anObject)
{
GCHandle gch = GCHandle.FromIntPtr(anObject);
MyClass myObject = (MyClass)gch.Target;
}