与[ComVisible]默认和公共类COM暴露有什么关系?

时间:2013-03-28 17:30:32

标签: c# com comvisible

MSDN有this article about [ComVisible] attribute。当我设置[ComVisible(true)]时,我不太清楚会发生什么。

MSDN说

  

默认值为true ,表示托管类型对COM可见。要使公共托管程序集类型可见,不需要此属性;它们在默认情况下对COM可见。只有公共类型可见。

因此他们说默认情况下公共类型对COM是可见的。但是他们还通过设置[ComVisible(true)]只有公共类型可以显示。它没有意义:如果公共类型默认可见,那么设置[ComVisible(true)]如何使公共类型可见?如果它们已经可见,它们将如何更加明显?

也许我的理解不正确。如果有人能对上述陈述有所了解,我将不胜感激。

2 个答案:

答案 0 :(得分:19)

技巧是您还可以在程序集级别(在AssemblyInfo.cs中)添加此属性。如果指定[assembly: ComVisible(true)](或者未在程序集级别指定,默认情况下具有相同的效果),则默认情况下,所有公共类和接口及其公共方法都将变为COM可见。

您也可以在程序集级别设置[assembly: ComVisible(false)],然后默认情况下所有公共实体都具有与它们[ComVisible(false)]相同的效果,因此您只能标记这些类/接口/方法COM-visible([ComVisible(true)]),你真正需要它。

当您有大量公共实体here时,这可以帮助您不要暴露太多。如果没有此机制,则必须将[ComVisible(false)]设置为您不希望公开的每个类/接口/方法。使用[assembly: ComVisible(false)]可以让您只展示所需的内容。

您只能将public实体公开给COM(默认或显式) - 具有更严格可见性的实体无法向COM公开。

答案 1 :(得分:18)

  

默认情况下,当公共类型可见时,没有意义,因此将ComVisible属性设置为true [ComVisible(true)]如何使公共类型可见。

默认情况下它们是可见的,因为ComVisibleAttribute的默认值为true。将属性显式设置为true不会改变任何内容,只会使您的意图更加清晰。这是您找到的the documentation的第一行:

  

默认值为 true ,表示托管类型对COM可见。不需要此属性来使公共托管程序集和类型可见;它们在默认情况下对COM可见。只能公开类型可见。该属性不能用于使COM可见的内部或受保护类型或使不可见类型的成员可见。

基本上,您可以将其视为默认情况下编译器始终将[ComVisibleAttribute(true)]添加到您的代码中,如果您不自己执行此操作。

您需要设置此属性的唯一原因是阻止公共类型变为COM可见(在这种情况下,您将其设置为false)。默认值已确保其可见性。

显然,非公开类型(例如私有和受保护的)不能也不会被COM看到。此属性对具有此类可访问性的类型没有影响。