COM互操作界面投射

时间:2011-04-11 13:16:50

标签: .net com-interop com-interface

关注this article,我已成功将C ++ COM类/接口声明翻译成C#,如下所示:

[InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid(IfaceGuid)]
public interface IFoo
{
  void Bar();
}

[ComImport, Guid(ClassGuid)]
public class Foo
{ }

我这样用:

var foo = new Foo();
var ifoo = (IFoo)foo;

ifoo.Bar();

我的问题是,考虑到Foo未实现IFoo(即使在运行时,typeof(Foo).GetInterfaces()为空)以及用户定义的接口转换,这怎么可能有效呢?被禁止了吗?

这是为COM保留的一些特殊处理吗? C#规范对此有何看法?

2 个答案:

答案 0 :(得分:2)

与" normal"相比,

ComImport类型的处理方式不同.NET类,因为它们构成了基础COM coclass的运行时可调用包装器。将其中一个实例转换为COM接口类型将透明地映射到对象的COM接口方法IUnknown.QueryInterface实现的调用中。

如果请求的接口的QI在COM级别成功,那么C#cast也将成功。

答案 1 :(得分:1)

嗯,是的,将标有ComImport的类转换为COM接口会导致QueryInterface()在引擎盖下 - 我想这是在RCW中完成的。

这种new导致CoCreateInstance()被调用,然后投射导致QueryInterface()被调用。