【问题标题】:Explicit interface implementation for COM interfaces in C#C#中COM接口的显式接口实现
【发布时间】:2012-02-07 07:17:28
【问题描述】:

前段时间,我正在对一个用 COM 实现的旧 Win32 程序进行重大重构,其中有多个部分是用 C# (.NET) 实现的。在我从事这个项目的过程中,我遇到了一个关于 C# 中 COM 编程的 Microsoft 页面,该页面建议 C# 类显式实现 COM 接口,而不是隐式实现。我最近试图记住原因,但我记不住。我也无法再次在 MSDN 网站上找到该页面。谁能告诉我为什么微软会推荐这个?

【问题讨论】:

    标签: c# com interface


    【解决方案1】:

    嗯,这有点道理,COM 是纯基于接口的编程,接口的实际实现应该被隐藏。显式实现接口方法可以自动实现这一点,因为它们不能公开。

    实际上这样做毫无意义,您可以(并且应该)简单地将[ClassInterface(ClassInterfaceType.None)] 属性应用于类。这本身就确保了实现不被暴露,只有类实现的接口是可见的。显式地实现接口方法实际上还不够好。因为您无法隐藏您的类继承 System.Object 的事实。它公开了 Object 的四个公共方法,并在您的类型库中放置了对 mscorlib.tlb 的引用,这是一个真正的 COM 客户端永远不会使用的引用。它几乎总是可以工作,因为使用你的类的编译器在没有安装 .NET 的机器上运行的可能性很小。但非常令人讨厌的是,它实际上并不是必需的。只有使用该类的机器需要安装它。

    只是不要这样做。声明你实现的接口,给它们[InterfaceType(ComInterfaceType.InterfaceIsDual)] 属性以允许它们在早期绑定和后期绑定中使用。并用[ClassInterface(ClassInterfaceType.None)] 隐藏它们的实际实现。唯一明智的方法。

    【讨论】:

      【解决方案2】:

      它很旧,但从这里开始:http://msdn.microsoft.com/en-us/library/aa288461%28v=VS.71%29.aspx 他们提到显式实现接口,以便您可以实现具有相同成员名称的多个接口。

      这还要求您的类的用户将您的类的实例转换为适当的接口。

      至于为什么这对 COM 特别重要:我的第一个猜测是 COM 可以调用一组方法,而托管代码可以调用另一组方法。不过,我猜这里。

      【讨论】:

      • 是的,我也认为是这样的,但我不确定。谢谢。
      猜你喜欢
      • 2012-03-01
      • 2011-02-17
      • 2011-09-29
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      • 2022-01-16
      • 2011-05-28
      • 1970-01-01
      相关资源
      最近更新 更多