COM互操作接口转换



在这篇文章之后,我已经成功地将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#规范对此有什么规定?

ComImport类型与"正常". net类的处理方式不同,因为它们构成了一个围绕底层COM协类的可运行时调用的包装。将其中一个实例强制转换为COM接口类型将透明地映射到对COM接口方法IUnknown.QueryInterface的对象实现的调用中。

如果所请求接口的QI在COM级别成功,那么c#转换也将成功。

嗯,是的,将标记为ComImport的类强制转换为COM接口会导致QueryInterface()在底层-我猜这是在RCW内完成的。

这样,new导致CoCreateInstance()被调用,然后强制转换导致QueryInterface()被调用。

相关内容

  • 没有找到相关文章

最新更新