C#中COM接口的显式接口实现

时间:2012-02-06 22:40:42

标签: c# com interface

前一段时间我正在研究用COM实现的旧Win32程序的重大重构,并且有各种各样的部分都是用C#(.NET)实现的。在我参与这个项目的过程中,我遇到了一个关于C#中COM编程的Microsoft页面,它建议C#类显式实现COM接口,而不是隐含。我最近试图记住原因,但我无法理解。我也无法再次在MSDN网站上找到该页面。有人可以告诉我为什么微软会推荐这个吗?

2 个答案:

答案 0 :(得分:3)

嗯,这有点意义,COM是纯粹的基于接口的编程,应该隐藏接口的实际实现。实现接口方法显然会自动获取,因为它们不能公开。

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

不要这样做。声明您实现的接口,为它们提供[InterfaceType(ComInterfaceType.InterfaceIsDual)]属性,以允许它们在早期和晚期绑定时使用。并使用[ClassInterface(ClassInterfaceType.None)]隐藏它们的实际实现。只有明智的方式。

答案 1 :(得分:1)

它已经过时了,但是从这里开始:http://msdn.microsoft.com/en-us/library/aa288461%28v=VS.71%29.aspx他们提到明确地实现了一个接口,这样你就可以实现多个具有相同成员名称的接口。

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

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