1

按照这篇文章,我已经成功地将 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# 规范对此有何评论?

4

2 回答 2

2

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

如果请求接口的 QI 在 COM 级别成功,则 C# 转换也将成功。

于 2011-04-11T13:50:55.123 回答
1

好吧,是的,对标有ComImportCOM 接口的类的强制转换会导致QueryInterface()幕后 - 我猜这是在 RCW 内部完成的。

这种方式new导致CoCreateInstance()被调用,然后演员导致QueryInterface()被调用。

于 2011-04-11T13:50:11.003 回答