¿Cómo reparar el ensamblaje al que se hace referencia no tiene un error de nombre seguro?

¿Cómo reparar el ensamblaje al que se hace referencia no tiene un error de nombre seguro?

Para evitar este error, puede:

  • Cargar el ensamblaje dinámicamente, o
  • Firme el ensamblado de terceros.

Encontrará instrucciones sobre cómo firmar ensamblados de terceros en .NET-fu:firma de un ensamblado sin firmar (sin demora en firmar) .

Firma de ensamblajes de terceros

El principio básico para firmar una tercera parte es

  1. Desmontar el ensamblaje usando ildasm.exe y guarde el idioma intermedio (IL):

    ildasm /all /out=thirdPartyLib.il thirdPartyLib.dll 
    
  2. Reconstruya y firme el ensamblado:

    ilasm /dll /key=myKey.snk thirdPartyLib.il
    

Corregir referencias adicionales

Los pasos anteriores funcionan bien a menos que su ensamblado de terceros (A.dll ) hace referencia a otra biblioteca (B.dll ) que también tiene que estar firmado. Puede desensamblar, reconstruir y firmar tanto A.dll y B.dll usando los comandos anteriores, pero en tiempo de ejecución, cargando B.dll fallará porque A.dll se creó originalmente con una referencia a unsigned versión 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 a

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 el IL de A.dll para la referencia a B.dll y agregue 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 de proyecto que está usando el proyecto que no "tiene una clave de nombre fuerte" y busca el .snk archivo (.StrongNameKey).

Busque este archivo en el Explorador de Windows (solo para que sepa dónde está).

De vuelta en Visual Studio en el proyecto que no "tiene una clave de nombre segura", haz

  • Haga clic derecho en el archivo del proyecto
  • Seleccionar propiedades
  • Seleccione "Pestaña de firma" (a la izquierda)
  • Haga clic en la casilla de verificación "Firmar el ensamblado"
  • Entonces <Browse> al .snk archivo que encontraste antes

Eso debería hacer el truco. Esto me resolvió un problema para un proyecto que usaba un formulario dentro de otro proyecto en la misma solución.

Espero que ayude.


Estaba buscando una solución al mismo problema y la opción "Firmar el ensamblado" me funcionó:

(como puede notar, la captura de pantalla proviene de VS2010, pero espero que ayude a alguien)