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

use*_*888 27 c# com comvisible

MSDN有关于[ComVisible]属性的这篇文章.我不太清楚当一个人设置时会发生什么[ComVisible(true)].

MSDN说

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

所以他们说公共类型默认是COM可见的.但他们也说只有通过设置才能看到公共类型[ComVisible(true)].它没有意义:如果默认情况下公共类型是可见的,那么设置如何[ComVisible(true)]使公共类型可见?如果它们已经可见,它们将如何变得更加醒目?

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

sha*_*oth 21

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

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

这有助于您在此处拥有大量公共实体时不会暴露太多.如果没有此机制,则必须设置[ComVisible(false)]您不希望公开的每个类/接口/方法.使用[assembly: ComVisible(false)]让你只暴露你需要的东西.

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


Cod*_*ray 20

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

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

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

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

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

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

  • 他们并不完全一样.例如,如果在程序集级别将ComVisible设置为false,则类中某处的"true"设置将覆盖它 (3认同)