c# - AssemblyInfo.cs: ¿Tiene algún sentido especificar un Guid cuando usa ComVisible(falso)?
.net (3)
Los GUID consistentes son absolutamente esenciales en COM. El atributo [assembly: Guid] genera la biblioteca de tipos LIBID. Seguramente, la plantilla del proyecto genera automáticamente uno para asegurarse de que el programador no se olvide de proporcionar uno cuando él / ella vuelven ComVisible a verdadero.
Si no se proporciona un ensamblado [Guid], Tlbexp.exe sintetiza uno del nombre del ensamblaje, la versión y la clave pública. Eso no es lo suficientemente bueno, las bibliotecas de tipos ya tienen una versión. Cambiar [AssemblyVersion] generaría un LIBID diferente. Especialmente malo cuando usa la opción de autoincremento para la versión (como 1.0. *), Puede llenar rápidamente el registro con una montaña de claves de registro TypeLib muertas.
Para resumir, evita muchos contratiempos desagradables.
Cuando crea un nuevo proyecto de C # en Visual Studio, el archivo AssemblyInfo.cs generado incluye un atributo que especifica un GUID de ensamblaje. El comentario sobre el atributo indica que se usa "si este proyecto está expuesto a COM".
Ninguno de mis ensamblajes contiene tipos que deben ser visibles para COM, por lo que he marcado mi ensamblaje con [assembly: ComVisible(false)]
. ¿Hay algún punto para especificar un GUID?
Mi impresión es que la respuesta es "no", entonces, ¿por qué el archivo AssemblyInfo.cs predeterminado contiene tanto [assembly: ComVisible(false)]
como [assembly: Guid("...")]
?
Editar:
Para resumir las respuestas:
Entre ellos, las respuestas explican que especificar un GUID es obligatorio si y solo si se está utilizando la interoperabilidad COM. Entonces, en mi situación, un GUID no es necesario.
sharptooth explica además que [assembly: ComVisible(false)]
no implica que no se use la interoperabilidad COM, ya que es posible anular ComVisible
para tipos individuales. Es por esta razón que AssembyInfo.cs por defecto contiene tanto [assembly: ComVisible(false)]
como un GUID.
No, no hay razón real para incluirlo. Es bastante innecesario, excepto en escenarios de interoperabilidad COM muy específicos. Aunque supongo que podría haber algo útil sobre tener un GUID al que se pueda acceder con reflexión. Pero como no está garantizado que esté allí, no es como si pudieras confiar en él.
Tener [assembly: ComVisible(false)]
y [assembly: Guid("...")]
al mismo tiempo tiene perfecto sentido en ciertos casos . Empiezas con un ensamblaje vacío y tal vez quieras exponer algo de él a COM. Por lo tanto, marca el conjunto como no ComVisible
y luego marca las entidades para ComVisible
como ComVisible
.
Seguramente no le importa si realmente no desea exponer nada de su ensamblaje a COM y tener la opción "Registrar para interoperabilidad COM" desactivada en la configuración del proyecto.