2011-02-01 22 views
6

Si quiero hacer que un ensamblado .NET se pueda usar como un servidor COM, tengo que agregar un conjunto de atributos y luego usar regasm para registrarlo como un servidor COM.¿Por qué exactamente el regasm me advierte sobre la firma con un nombre fuerte?

Si el conjunto no está firmado con un nombre seguro regasm cuando se ejecuta con /codebase clave muestra una advertencia RA0000 diciendo que el montaje podría interferir con otros conjuntos en el mismo equipo y yo debería firmar con un nombre fuerte, pero el registro tiene éxito e incluso funciona bien.

Los nombres fuertes de AFAIK están destinados a prevenir el supuesto infierno de DLL. Pero COM también estaba destinado a prevenir el infierno de DLL. Si cambio cualquier interfaz expuesta a COM, debo cambiar el GUID o al menos mantener la compatibilidad binaria. Así que firmar con un nombre fuerte no parece agregar nada útil, nada me impide romper las interfaces COM, luego firmar con el mismo par de llaves y tener un infierno completo de DLL.

¿De qué sirve firmar con un nombre seguro en el caso de los ensamblados .NET expuestos a COM?

Respuesta

7

Es una advertencia torpe. Hay dos aspectos para COM DLL Hell. Lo realmente malo es modificar las interfaces públicas y no asignar nuevos GUID. Una aplicación de cliente que no se compiló tiende a bloquearse y grabarse cuando se trata de un método completamente incorrecto o de bombas con una desagradable AccessViolationException que no da ninguna pista sobre cuál podría ser la causa.

El segundo está haciendo todo bien (asignando nuevos GUID) pero luego sobrescribe el DLL existente con la nueva versión. Seguirá bloqueando esa aplicación cliente obsoleta, pero más suavemente con un hresult E_NOINTERFACE que genera una excepción bastante específica que le ayuda a diagnosticar la causa. El usuario no es más feliz sin embargo.

Ese escenario tiene una solución en .NET, el GAC apoya el despliegue de lado a lado de los conjuntos sometidos a diferentes números de versión para que tanto la antigua y la nueva versión puede coexistir y la aplicación cliente rancio continúa para ser feliz con la versión anterior. Lo cual requiere un nombre fuerte. Sí, esa advertencia ciertamente podría haber sido suprimida cuando use/codebase, ya que eso deja bastante claro que no va a usar el GAC. Aunque no está de más alterar un poco el uso de/codebase. Además, nunca usa el GAC en su máquina de desarrollo mientras lo prueba, pero ciertamente debe considerarlo al implementarlo.

1

La nomenclatura fuerte se utiliza principalmente para poner los Dlls en el GAC. Por lo tanto, puede tener varias versiones de la DLL con el mismo nombre (!) De forma segura en la misma computadora, lo que con COM-Dlls comunes a menudo produce problemas. No firmar Dlls elimina la capacidad de GAC. No tiene problemas inmediatos debido a eso, pero no usa una función útil, por lo que recibe una advertencia.

2

Que yo sepa, COM no estaba destinado a prevenir el infierno de DLL, era el pozo de Hades. El término "DLL Hell" proviene del problema de múltiples bibliotecas, cada una con los mismos métodos. El registro de ensamblados COM en el registro del sistema no ayuda con la resolución en tiempo de ejecución.

La firma de un ensamblaje que pretende actuar como servidor COM garantiza que el ensamblaje no colisione con otros ensamblajes COM-registrados en la misma computadora. Sin la firma, si dos ensamblajes registrados COM tenían métodos del mismo nombre, podría causar problemas.

Cuestiones relacionadas