MSDN有this article about [ComVisible]
attribute。当我设置[ComVisible(true)]
时,我不太清楚会发生什么。
默认值为true ,表示托管类型对COM可见。要使公共托管程序集和类型可见,不需要此属性;它们在默认情况下对COM可见。只有公共类型可见。
因此他们说默认情况下公共类型对COM是可见的。但是他们还通过设置[ComVisible(true)]
说只有公共类型可以显示。它没有意义:如果公共类型默认可见,那么设置[ComVisible(true)]
如何使公共类型可见?如果它们已经可见,它们将如何更加明显?
也许我的理解不正确。如果有人能对上述陈述有所了解,我将不胜感激。
答案 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看到。此属性对具有此类可访问性的类型没有影响。