c# com comvisible

c# - ¿Cuál es el trato con la exposición de[COMVisible] por defecto y las clases públicas de COM?



(2)

MSDN tiene este artículo sobre el atributo [ComVisible] . No entiendo bien lo que sucede cuando se establece [ComVisible(true)] .

MSDN dice

El valor predeterminado es verdadero , lo que indica que el tipo administrado es visible para COM. Este atributo no es necesario para hacer visibles los conjuntos y tipos gestionados públicamente ; son visibles para COM de forma predeterminada. Sólo los tipos públicos pueden hacerse visibles.

Así que dicen que los tipos públicos son visibles para COM de forma predeterminada. Pero también dicen que solo se pueden hacer visibles los tipos públicos configurando [ComVisible(true)] . No tiene sentido: si los tipos públicos están visibles de forma predeterminada, entonces, ¿cómo la configuración [ComVisible(true)] hace que los tipos públicos sean visibles? Si ya están visibles, ¿cómo se harán más visibles?

Tal vez mi entendimiento no sea correcto. Apreciaré si alguien puede poner algo de luz en las declaraciones anteriores.


No tiene sentido, cuando los tipos públicos están visibles de forma predeterminada, entonces, ¿cómo establecer el atributo ComVisible en verdadero [ComVisible (verdadero)] hace que los tipos públicos estén visibles?

Son visibles de forma predeterminada porque el valor predeterminado de ComVisibleAttribute es verdadero. Establecer el atributo explícitamente en verdadero no cambia nada, solo hace que sus intenciones sean más claras. Esa es la primera línea de la documentación que encontraste:

El valor predeterminado es verdadero , lo que indica que el tipo administrado es visible para COM. Este atributo no es necesario para hacer visibles los conjuntos y tipos gestionados públicamente; son visibles para COM de forma predeterminada. Sólo los tipos públicos pueden hacerse visibles. El atributo no se puede usar para hacer que un tipo interno o protegido sea visible para COM o para que los miembros de un tipo no visible sean visibles.

Básicamente, puede pensar que el compilador siempre agrega [ComVisibleAttribute(true)] a su código de manera predeterminada si no lo hace usted mismo.

La única razón por la que necesitaría establecer este atributo es para evitar que los tipos públicos sean visibles a COM (en cuyo caso lo establecería en falso). El valor predeterminado ya garantiza su visibilidad.

Obviamente, los tipos no públicos (por ejemplo, privados y protegidos) no pueden y nunca serán visibles para COM. Este atributo no tiene efecto en los tipos con tal accesibilidad.


El truco es que también puede agregar este atributo a nivel de ensamblaje (en AssemblyInfo.cs). Si especifica [assembly: ComVisible(true)] (o no especifica eso en el nivel de ensamblaje y, por lo tanto, tiene el mismo efecto de manera predeterminada), todas las clases e interfaces públicas y sus métodos públicos serán visibles para COM de manera predeterminada.

También podría establecer [assembly: ComVisible(false)] a nivel de ensamblaje y luego todas las entidades públicas tendrían por defecto el mismo efecto que si tuvieran [ComVisible(false)] en ellas, por lo que solo podría marcar esas clases / interfaces / methods COM-visible ( [ComVisible(true)] ) que realmente necesita.

Esto le ayuda a no exponerse demasiado cuando tiene muchas entidades públicas como here . Sin este mecanismo, tendría que configurar [ComVisible(false)] para cada clase / interfaz / método que no quiera que se exponga. Usar [assembly: ComVisible(false)] permite solo exponer las cosas que necesita.

Y solo puede exponer public entidades public a COM (sea predeterminado o explícitamente): las entidades con visibilidad más estricta no pueden ser expuestas a COM.