【发布时间】:2010-04-17 19:31:37
【问题描述】:
例如。我有以下委托方法,我想将其用作非托管代码的回调函数:
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 对象?
【问题讨论】:
标签: c# callback unmanaged marshalling