1

我编写了一些 C# 代码,它使用 .NET 将 .NET 对象作为IDispatch指针返回给非托管代码Marshal.GetIDispatchForObject,但是,该对象还实现了其他(非 .NET 定义的)COM 接口。但是,在这些接口的非托管世界QueryInterface中,调用它们的方法永远不会中断我的 .NET 代码,并且似乎只返回默认值 (0)。

是否可以将 .NET 对象编组为双接口,以便可以通过IDispatch或通过查询特定接口来使用它?我的类型是公开的,ComVisible我尝试申请[ClassInterface(ClassInterfaceType.AutoDual)]但没有运气。

UnmanagedType.Interface使用编组让事情正常工作我没有任何问题,但是,支持IDispatch也似乎有问题。如果有一种简单的方法可以“手动”实现IDispatch,这也是一个可以接受的解决方案。

4

1 回答 1

1

您可以使用ICustomQueryInterface 接口。它将允许您“手动”返回 IUnknown 接口,并且仍然可以从 .NET 提供的 IDispatch 实现中受益。因此,例如,如果您有一个包含一个方法(在示例中名为“MyUnknownMethod”)的非托管 IUnknown 接口“IMyUnknown”,则可以像这样声明您的 .NET 类:

[ComVisible(true)]
public class Class1 : ICustomQueryInterface, IMyUnknown
{
    CustomQueryInterfaceResult ICustomQueryInterface.GetInterface(ref Guid iid, out IntPtr ppv)
    {
        if (iid == typeof(IMyUnknown).GUID)
        {
            ppv = Marshal.GetComInterfaceForObject(this, typeof(IMyUnknown), CustomQueryInterfaceMode.Ignore);
            return CustomQueryInterfaceResult.Handled;
        }

        ppv = IntPtr.Zero;
        return CustomQueryInterfaceResult.NotHandled;
    }

    // an automatic IDispatch method
    public void MyDispatchMethod()
    {
       ...
    }

    // the IMyUnknown method
    // note you can declare that method with a private implementation
    public void MyUnknownMethod()
    {
       ...
    }
}
于 2017-06-13T06:25:26.793 回答