【问题标题】:Receiving an object in a unmanaged callback function在非托管回调函数中接收对象
【发布时间】: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


    【解决方案1】:

    GCHandle.FromIntPtr Method:

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

    【讨论】:

    • 当我看到您更新的答案时,我正要回来告诉我找到了一种将 GCHandöe 转换为 IntPtr 的方法,反之亦然。非常感谢人:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 2010-12-28
    • 2013-04-01
    • 2011-10-03
    相关资源
    最近更新 更多