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

4

之前我在重构一个使用COM实现的旧Win32程序时,其中一些部分是使用C# (.NET)实现的。在项目中工作期间,我发现Microsoft有一页关于C#编程的COM编程页面,推荐明确地让C#类实现COM接口而不是隐式实现。最近我试图回忆为什么会这样建议,但我想不起来了。我也找不到那个MSDN网站上的页面了。请问,有人能告诉我Microsoft为什么会这样推荐吗?

2个回答

3

嗯,这有点合理,COM是纯接口编程,接口的实际实现应该被隐藏。显式实现接口方法会自动帮助你实现这一点,因为它们不能是public。

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

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


1

虽然这篇文章有些老,但是从这里http://msdn.microsoft.com/en-us/library/aa288461%28v=VS.71%29.aspx可以看到,它提到了显式实现接口的方法,这样你就可以实现多个具有相同成员名称的接口。

这也要求你的类的使用者将你的类的实例强制转换为适当的接口。

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


是的,我也认为是这样,但我不确定。谢谢。 - Alex Marshall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接