Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将.NET对象手动封送为双COM接口?_C#_.net_Com_Idispatch - Fatal编程技术网

C# 如何将.NET对象手动封送为双COM接口?

C# 如何将.NET对象手动封送为双COM接口?,c#,.net,com,idispatch,C#,.net,Com,Idispatch,我编写了一些C#代码,它使用Marshal.GetIDispatchForObject将.NET对象作为IDispatch指针返回给非托管代码,但是,该对象还实现了其他(非.NET定义的)COM接口。 在非托管环境中,这些接口的QueryInterface工作正常,但是,对它们调用方法不会进入我的.NET代码,似乎只返回默认值(0) 是否可以将.NET对象封送为双接口,以便可以通过IDispatch或通过查询特定接口来使用它?我的类型是public,ComVisible,我尝试了应用[Class

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

是否可以将.NET对象封送为双接口,以便可以通过
IDispatch
或通过查询特定接口来使用它?我的类型是public,
ComVisible
,我尝试了应用
[ClassInterface(ClassInterfaceType.AutoDual)]
,但运气不佳

使用
UnmanagedType.Interface
封送处理,我在让事情正常运行方面没有遇到任何问题,但是,支持
IDispatch
似乎也有问题。如果有一种“手动”实现IDispatch的简单方法,这也是一种可接受的解决方案。

您可以使用。它将允许您“手动”返回IUnknown接口,并且仍然受益于.NET提供的IDispatch实现。 因此,例如,如果您有一个非托管IUnknown接口“IMyUnknown”,其中包含一个方法(在示例中称为“MyUnknownMethod”),则可以如下方式声明.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()
    {
       ...
    }
}

我已经有很长时间没有参与这些工作了,但是我认为应该将class interface属性设置为
None
,然后自己手动实现接口。