Cómo solucionar el error "El ensamblaje al que se hace referencia no tiene un nombre seguro"
Agregué un ensamblado con un nombre débil a mi proyecto de Visual Studio 2005 (que tiene un nombre seguro). Ahora recibo el error:
"El ensamblado al que se hace referencia 'xxxxxxxx' no tiene un nombre seguro"
¿Necesito firmar esta asamblea de terceros?
Para evitar este error, puede:
- Cargue el ensamblaje dinámicamente, o
- Firme la asamblea de terceros.
Encontrará instrucciones sobre cómo firmar ensamblados de terceros en .NET-fu: Firmar un ensamblado sin firmar (sin demora en la firma) .
Firma de asambleas de terceros
El principio básico para firmar un tercero es
Desarme el ensamblaje usando
ildasm.exe
y guarde el lenguaje intermedio (IL):ildasm /all /out=thirdPartyLib.il thirdPartyLib.dll
Reconstruir y firmar la asamblea:
ilasm /dll /key=myKey.snk thirdPartyLib.il
Arreglando referencias adicionales
Los pasos anteriores funcionan bien a menos que su ensamblado de terceros ( A.dll ) haga referencia a otra biblioteca ( B.dll ) que también deba estar firmada. Puede desmontar, reconstruir y firmar tanto A.dll como B.dll usando los comandos anteriores, pero en tiempo de ejecución, la carga de B.dll fallará porque A.dll se creó originalmente con una referencia a la versión sin firmar de B.dll .
La solución a este problema es parchear el archivo IL generado en el paso 1 anterior. Deberá agregar el token de clave pública de B.dll a la referencia. Obtienes este token llamando
sn -Tp B.dll
que le dará el siguiente resultado:
Microsoft (R) .NET Framework Strong Name Utility Version 4.0.30319.33440
Copyright (c) Microsoft Corporation. All rights reserved.
Public key (hash algorithm: sha1):
002400000480000094000000060200000024000052534131000400000100010093d86f6656eed3
b62780466e6ba30fd15d69a3918e4bbd75d3e9ca8baa5641955c86251ce1e5a83857c7f49288eb
4a0093b20aa9c7faae5184770108d9515905ddd82222514921fa81fff2ea565ae0e98cf66d3758
cb8b22c8efd729821518a76427b7ca1c979caa2d78404da3d44592badc194d05bfdd29b9b8120c
78effe92
Public key token is a8a7ed7203d87bc9
La última línea contiene el token de clave pública. Luego debe buscar en el IL de A.dll la referencia a B.dll y agregar el token de la siguiente manera:
.assembly extern /*23000003*/ MyAssemblyName
{
.publickeytoken = (A8 A7 ED 72 03 D8 7B C9 )
.ver 10:0:0:0
}
Expanda el archivo del proyecto que utiliza el proyecto que no "tiene una clave de nombre seguro" y busque el .snk
archivo (.StrongNameKey).
Busque este archivo en el Explorador de Windows (solo para saber dónde está).
De vuelta en Visual Studio, en el proyecto que no "tiene una clave de nombre segura", haga
- Haga clic derecho en el archivo del proyecto.
- Seleccionar propiedades
- Seleccione "Pestaña Firma" (a la izquierda)
- Haga clic en la casilla de verificación "Firmar el ensamblaje"
- Luego
<Browse>
al.snk
archivo que encontraste antes.
Eso debería hacer el truco. Esto me resolvió un problema para un proyecto usando un formulario dentro de otro proyecto en la misma solución.
Espero que ayude.