2010-02-27 10 views
34

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".AssemblyInfo.cs: ¿Hay algún punto al especificar un Guid cuando se usa ComVisible (falso)?

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 es necesario especificar un GUID si y sólo si se utiliza 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 COM interoperabilidad, ya que es posible anular ComVisible para tipos individuales. Es por esta razón que AssembyInfo.cs por defecto contiene [assembly: ComVisible(false)] y un GUID.

Respuesta

14

Tener [assembly: ComVisible(false)] y [assembly: Guid("...")] al mismo tiempo tiene perfecto sentido in certain cases. Empiezas con un ensamblaje vacío y tal vez quieras exponer algo de él a COM. Por lo tanto, marque el conjunto como no ComVisible y luego marque las entidades para exponer 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" sin marcar en la configuración del proyecto.

4

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.

+0

Tiene un [uso] bastante grande (http://stackoverflow.com/q/11403333/712526) para un servidor web independiente que necesita un certificado SSL – jpaugh

+0

@jpaugh: No estoy seguro de que estamos hablando de la la misma cosa. – Josh

+0

No estoy del todo seguro, yo mismo; pero, tuve que usar el GUID de la información del ensamblado para que funcione ese escenario (vea la parte inferior de mi respuesta en esa página). Mi conclusión (provisional) es que Windows usa una interfaz COM para hacer que un enlace SSL se "adhiera" a una aplicación particular. – jpaugh

9

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 conjunto [Guid], Tlbexp.exe sintetiza uno a partir del nombre del ensamblado, 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.

En resumen, evita muchos contratiempos desagradables.

+1

No olvide que puede establecer ComVisible en "falso" en el nivel de ensamblaje y establecerlo en "verdadero" para clases/interfaces/métodos dentro del ensamblaje y este último reemplazará al anterior. Consulte http://stackoverflow.com/questions/1649752/how-to-elegantly-prevent-a-webservice-proxy-from-being-exposed-to-com para saber cómo se puede usar. Por lo tanto, en realidad no se necesita "encender" el nivel de ensamblaje. – sharptooth

+1

Tener un GUID constante solo importa si su biblioteca de tipos necesita estar expuesta a clientes COM que esperan una interfaz en particular. Todavía puede exponer objetos a COM a través de IDispatch sin un GUID permanente. – Josh

+0

Hmm, el enlace tardío requiere un ProgID constante. El mismo problema. –

Cuestiones relacionadas