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

时间:2010-04-17 19:31:37

标签: c# callback unmanaged marshalling

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对象?

1 个答案:

答案 0 :(得分:2)

GCHandle.FromIntPtr Method

void MyCallback(IntPtr anObject)
{
    GCHandle gch = GCHandle.FromIntPtr(anObject);
    MyClass myObject = (MyClass)gch.Target;
}