Cómo solucionar el error "El ensamblaje al que se hace referencia no tiene un nombre seguro"

Resuelto ng5000 asked hace 15 años • 16 respuestas

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?

ng5000 avatar Dec 02 '08 00:12 ng5000
Aceptado

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

  1. Desarme el ensamblaje usando ildasm.exey guarde el lenguaje intermedio (IL):

    ildasm /all /out=thirdPartyLib.il thirdPartyLib.dll 
    
  2. 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
}
Dirk Vollmar avatar Dec 01 '2008 17:12 Dirk Vollmar

Expanda el archivo del proyecto que utiliza el proyecto que no "tiene una clave de nombre seguro" y busque el .snkarchivo (.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 .snkarchivo 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.

MrOli3000 avatar Jul 10 '2012 07:07 MrOli3000