C# 如何将.NET对象手动封送为双COM接口?
我编写了一些C#代码,它使用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
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
,然后自己手动实现接口。