35

MSDN 有这篇关于[ComVisible]属性的文章。我不太明白当一个集合时会发生什么[ComVisible(true)]

MSDN 说

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

所以他们说公共类型默认对 COM 可见。但他们也说只有公共类型可以通过设置可见[ComVisible(true)]。这没有意义:如果公共类型默认可见,那么设置如何[ComVisible(true)]使公共类型可见?如果它们已经可见,它们将如何变得更加可见?

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

4

2 回答 2

27

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

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

当您有很多公共实体时,这可以帮助您不要暴露太多,就像这里一样。如果没有这种机制,您将不得不设置[ComVisible(false)]您不想暴露的每个类/接口/方法。Using[assembly: ComVisible(false)]让你只暴露你需要的东西。

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

于 2013-03-29T08:50:31.660 回答
22

当公共类型默认可见时,这是没有意义的,那么将 ComVisible 属性设置为 true [ComVisible(true)] 如何使公共类型可见。

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

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

基本上,你可以把它想象成编译器总是[ComVisibleAttribute(true)]默认添加到你的代码中,如果你不自己做的话。

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

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

于 2013-03-28T17:40:35.507 回答