¿Cómo reparar el error “El ensamblaje referenciado no tiene un nombre seguro”?

Agregué un ensamblado débilmente nombrado a mi proyecto de Visual Studio 2005 (que recibe un gran nombre). Ahora recibo el error:

El “ensamblaje al que se hace referencia ‘xxxxxxxx’ no tiene un nombre seguro”

¿Debo firmar esta asamblea de terceros?

Para evitar este error, puede:

  • Cargue el conjunto dinámicamente, o
  • Firme la asamblea de terceros.

Encontrará instrucciones para firmar ensamblajes de terceros en .NET-fu: firma de un ensamblaje sin firmar (sin firma de demora) .

Firma de ensamblajes de terceros

El principio básico para firmar un partido thirp es

  1. Desmonte el ensamblaje usando ildasm.exe y guarde el lenguaje intermedio (IL):

     ildasm /all /out=thirdPartyLib.il thirdPartyLib.dll 
  2. Reconstruye y firma el ensamblaje:

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

Reparar 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 debe estar firmada. Puede desensamblar, reconstruir y firmar tanto A.dll como B.dll usando los comandos anteriores, pero en el tiempo de ejecución, la carga de B.dll fallará porque A.dll se construyó 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 de proyecto que está utilizando el proyecto que no “tiene una clave de nombre segura” y busque el archivo .snk (.StrongNameKey).

Navegue a través de 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 fuerte”, haga

  • Haga clic derecho en el archivo del proyecto
  • Seleccionar propiedades
  • Seleccione “pestaña Firma” (a la izquierda)
  • Haga clic en la checkbox “Firmar el ensamblaje”
  • Luego & ltBrowse> al archivo .snk que encontraste antes

Eso debería hacer el truco. Esto me solucionó 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 para el mismo problema y la opción “Firmar el ensamblaje” sin marcar funciona para mí:

enter image description here

(Como puede ver, la captura de pantalla viene de VS2010 pero con suerte ayudará a alguien)

He escrito una herramienta para ensamblar firmas de nombres de manera automática, incluidas aquellas para las que no tienes el código fuente o proyectos que han sido abandonados. Utiliza muchas de las técnicas descritas en las respuestas de una manera sencilla sin ninguno de los defectos o inconvenientes de las herramientas existentes o las instrucciones con fecha.

http://brutaldev.com/post/2013/10/18/NET-Assembly-Strong-Name-Signer

Espero que esto ayude a cualquiera que necesite firmar un ensamble de terceros sin tener que pasar por aros para llegar allí.

Puede usar ensamblajes sin signo si su ensamblaje tampoco está firmado.

Firmar la asamblea de terceros funcionó para mí:

http://www.codeproject.com/Tips/341645/Referenced-assembly-does-not-have-a-strong-name

EDIT : he aprendido que es útil publicar pasos en caso de que el artículo vinculado ya no sea válido. Todo el crédito es para Hiren Khirsaria :

  1. Ejecute el símbolo del sistema visual studio y vaya al directorio donde se encuentra su DLL.

    For Example my DLL is located in D:/hiren/Test.dll

  2. Ahora crea el archivo IL usando el siguiente comando.

    D:/hiren> ildasm /all /out=Test.il Test.dll (este comando genera la biblioteca de códigos)

  3. Genera una nueva clave para firmar tu proyecto.

    D:/hiren> sn -k mykey.snk

  4. Ahora firme su biblioteca usando el comando ilasm .

    D:/hiren> ilasm /dll /key=mykey.snk Test.il

Cómo firmar un ensamblado de terceros sin firmar

  1. Abra el símbolo del sistema del desarrollador para Visual Studio. Esta herramienta está disponible en sus progtwigs de Windows y se puede encontrar utilizando la búsqueda predeterminada de Windows.
  2. Asegúrese de que su mensaje tenga acceso a las siguientes herramientas ejecutándolas una vez: sn ildasm y ilasm
  3. Navegue a la carpeta donde se encuentra su Cool.Library.dll
  4. sn –k Cool.Library.snk para crear un nuevo par de claves
  5. ildasm Cool.Library.dll /out:Cool.Library.il para desmontar la biblioteca
  6. move Cool.Library.dll Cool.Library.unsigned.dll para mantener la biblioteca original como una copia de seguridad
  7. ilasm Cool.Library.il /dll /resource=Cool.Library.res /key=Cool.Library.snk para volver a ensamblar la biblioteca con un nombre ilasm Cool.Library.il /dll /resource=Cool.Library.res /key=Cool.Library.snk
  8. powershell -command "& {[System.Reflection.AssemblyName]::GetAssemblyName($args).FullName} Cool.Library.dll" para obtener el ensamblaje del nombre completo. Necesitará este bit si tiene que hacer referencia a la DLL en archivos de configuración externos como web.config o app.config.

Tuve este problema para una aplicación que se denominó con fuerza y ​​luego tuve que cambiarla para hacer referencia a un ensamblado no fuertemente nombrado, por lo que desactivé ‘Firmar el ensamblado’ en la sección Firma de propiedades del proyecto, pero aún así se quejó. Pensé que tenía que ser un artefacto en alguna parte causante del problema, ya que hice todo lo demás correctamente y fue solo eso. Encontré y eliminé la línea: [assembly: AssemblyKeyFile (“yourkeyfilename.snk”)] desde su archivo assemblyInfo.cs. Luego no generar quejas después de eso.

Me encontré con esto con un ServiceStack dll que había instalado con Nuget. Resulta que había otro conjunto de dlls disponibles que estaban etiquetados como firmados. No va a ser la respuesta para todos, pero es posible que solo deba verificar si hay una versión firmada de su ensamblaje. ServiceStack.Signed

La eliminación de la marca de verificación “Firmar el ensamblaje” en la pestaña “Firma” funciona como dijo @Michal Stefanow.

Agregar aquí es la manera más simple de firmar sus propios archivos y / o los archivos de otras personas. Solo necesita agregar esta línea debajo de la “línea de comando de evento posterior a la construcción”:

 "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\signtool.exe" sign /f "$(ProjectDir)\YourPfxFileNameHere.pfx" /p YourPfxFilePasswordHere /d "Your software title here" /du http://www.yourWebsiteHere.com /t http://timestamp.verisign.com/scripts/timstamp.dll /v "$(BaseOutputPath)$(TargetFileName)" 

Puede firmar archivos de otras personas o sus propios archivos y todos los que desee.

enter image description here

Una vieja pregunta, pero estoy sorprendido de que nadie haya mencionado ilmerge todavía. ilmerge es de Microsoft, pero no se envía con VS o los SDK. Puede descargarlo desde aquí sin embargo. También hay un repository de Github . También puedes instalar desde nuget:

 PM>Install-Package ilmerge 

Usar:

 ilmerge assembly.dll /keyfile:key.snk /out:assembly.dll /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 /ndebug 

Si es necesario, puede generar su propio archivo de claves usando sn (de VS):

 sn -k key.snk 

Para mí, mi problema era que tenía dos de los mismos paquetes NuGet instalados con diferentes versiones.