Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中COM接口的显式接口实现#_C#_Com_Interface - Fatal编程技术网

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

C# C语言中COM接口的显式接口实现#,c#,com,interface,C#,Com,Interface,前一段时间,我正在对一个用COM实现的旧Win32程序进行重大重构,其中有许多部分是用C#(.NET)实现的。在我从事这个项目的过程中,我遇到了一个关于C#中COM编程的Microsoft页面,该页面建议C#类显式实现COM接口,而不是隐式实现。我最近试着回忆为什么,但我记不起来了。我也无法在MSDN站点上再次找到该页面。有人能告诉我为什么微软会推荐这个吗?它很古老,但从这里开始:他们明确提到实现一个接口,这样你就可以实现多个具有相同成员名称的接口 这还要求类的用户将类的实例强制转换为适当的接口

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

它很古老,但从这里开始:他们明确提到实现一个接口,这样你就可以实现多个具有相同成员名称的接口

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


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

嗯,这有点道理,COM是纯基于接口的编程,接口的实际实现应该隐藏起来。由于接口方法不能是公共的,所以显式实现接口方法会自动获取这些方法

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


别这样。声明您实现的接口,为它们提供
[InterfaceType(ComInterfaceType.InterfaceAisDual)]
属性,以允许它们在早期和后期绑定时使用。并使用
[ClassInterface(ClassInterfaceType.None)]
隐藏它们的实际实现。唯一明智的方法。

是的,我也认为是这样,但我不确定。非常感谢。