【问题标题】:COM interop interface castingCOM 互操作接口转换
【发布时间】:2011-04-11 13:16:50
【问题描述】:

在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# 规范对此有何规定?

【问题讨论】:

    标签: .net com-interop com-interface


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      这样new 导致CoCreateInstance() 被调用,然后演员阵容导致QueryInterface() 被调用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-15
        • 2013-10-15
        • 2010-12-14
        • 1970-01-01
        • 2011-04-13
        • 2011-11-18
        相关资源
        最近更新 更多