【发布时间】:2012-02-07 07:17:28
【问题描述】:
前段时间,我正在对一个用 COM 实现的旧 Win32 程序进行重大重构,其中有多个部分是用 C# (.NET) 实现的。在我从事这个项目的过程中,我遇到了一个关于 C# 中 COM 编程的 Microsoft 页面,该页面建议 C# 类显式实现 COM 接口,而不是隐式实现。我最近试图记住原因,但我记不住。我也无法再次在 MSDN 网站上找到该页面。谁能告诉我为什么微软会推荐这个?
【问题讨论】:
前段时间,我正在对一个用 COM 实现的旧 Win32 程序进行重大重构,其中有多个部分是用 C# (.NET) 实现的。在我从事这个项目的过程中,我遇到了一个关于 C# 中 COM 编程的 Microsoft 页面,该页面建议 C# 类显式实现 COM 接口,而不是隐式实现。我最近试图记住原因,但我记不住。我也无法再次在 MSDN 网站上找到该页面。谁能告诉我为什么微软会推荐这个?
【问题讨论】:
嗯,这有点道理,COM 是纯基于接口的编程,接口的实际实现应该被隐藏。显式实现接口方法可以自动实现这一点,因为它们不能公开。
实际上这样做毫无意义,您可以(并且应该)简单地将[ClassInterface(ClassInterfaceType.None)] 属性应用于类。这本身就确保了实现不被暴露,只有类实现的接口是可见的。显式地实现接口方法实际上还不够好。因为您无法隐藏您的类继承 System.Object 的事实。它公开了 Object 的四个公共方法,并在您的类型库中放置了对 mscorlib.tlb 的引用,这是一个真正的 COM 客户端永远不会使用的引用。它几乎总是可以工作,因为使用你的类的编译器在没有安装 .NET 的机器上运行的可能性很小。但非常令人讨厌的是,它实际上并不是必需的。只有使用该类的机器需要安装它。
只是不要这样做。声明你实现的接口,给它们[InterfaceType(ComInterfaceType.InterfaceIsDual)] 属性以允许它们在早期绑定和后期绑定中使用。并用[ClassInterface(ClassInterfaceType.None)] 隐藏它们的实际实现。唯一明智的方法。
【讨论】:
它很旧,但从这里开始:http://msdn.microsoft.com/en-us/library/aa288461%28v=VS.71%29.aspx 他们提到显式实现接口,以便您可以实现具有相同成员名称的多个接口。
这还要求您的类的用户将您的类的实例转换为适当的接口。
至于为什么这对 COM 特别重要:我的第一个猜测是 COM 可以调用一组方法,而托管代码可以调用另一组方法。不过,我猜这里。
【讨论】: