2011-04-11 71 views
1

this article,我已经成功地转换过来的C++ COM类/接口声明成C#这样的:COM互操作界面铸造

[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

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

如果请求的接口的QI在COM级别成功,那么C#类型转换也会成功。

1

嗯,是的,对于标记为ComImport的COM类接口导致QueryInterface()下的引擎盖 - 我猜是在RCW内部完成的。

这样new导致CoCreateInstance()被调用,然后铸造导致QueryInterface()被调用。