c# - strongly - strong name tool
¿Cómo corregir el error "El ensamblaje al que se hace referencia no tiene un nombre seguro"? (12)
He agregado un ensamblaje con un nombre débil a mi proyecto de Visual Studio 2005 (que tiene un nombre seguro). Ahora estoy recibiendo el error:
"El ensamblado referenciado ''xxxxxxxx'' no tiene un nombre seguro"
¿Necesito firmar esta asamblea de terceros?
Cómo firmar una asamblea de terceros sin firmar
- Abra el símbolo del sistema del desarrollador para Visual Studio. Esta herramienta está disponible en sus programas de Windows y se puede encontrar utilizando la búsqueda predeterminada de Windows.
- Asegúrese de que su indicador tenga acceso a las siguientes herramientas ejecutándolas una vez:
sn
ildasm
eilasm
- Vaya a la carpeta donde se encuentra su Cool.Library.dll
-
sn –k Cool.Library.snk
para crear un nuevo par de claves -
ildasm Cool.Library.dll /out:Cool.Library.il
para desensamblar la biblioteca -
move Cool.Library.dll Cool.Library.unsigned.dll
para mantener la biblioteca original como una copia de seguridad -
ilasm Cool.Library.il /dll /resource=Cool.Library.res /key=Cool.Library.snk
para volver a ensamblar la biblioteca con un nombreilasm Cool.Library.il /dll /resource=Cool.Library.res /key=Cool.Library.snk
-
powershell -command "& {[System.Reflection.AssemblyName]::GetAssemblyName($args).FullName} Cool.Library.dll"
para obtener el nombre completo del ensamblado. Necesitará este bit si tiene que hacer referencia a la DLL en archivos de configuración externos como web.config o app.config.
Antigua pregunta, pero me sorprende que nadie haya mencionado aún la etiqueta. ilmerge es de Microsoft, pero no se incluye con VS o SDK. Puede descargarlo desde here sin embargo. También hay un repositorio github . También puede 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 (desde VS):
sn -k key.snk
Estaba buscando una solución para el mismo problema y desmarcar la opción "Firmar el ensamblaje" funciona para mí:
(Como puede notar, la captura de pantalla viene de VS2010, pero espero que ayude a alguien)
Expanda el archivo de proyecto que usa el proyecto que no tiene "clave de nombre seguro" y busque el archivo .snk (.StrongNameKey).
Examine este archivo en Windows Explorer (solo para que sepa dónde está).
De vuelta en Visual Studio en el proyecto que no tiene "clave de nombre seguro", haga
- Haga clic derecho en el archivo del proyecto
- Seleccione Propiedades
- Seleccione "pestaña de firma" (a la izquierda)
- Haga clic en la casilla de verificación "Firmar el conjunto"
- Luego & ltBrowse> al archivo .snk que encontraste anteriormente
Eso debería hacer el truco. Esto resolvió un problema para mí para un proyecto utilizando un formulario dentro de otro proyecto en la misma solución.
Espero que ayude.
Firmar la asamblea de terceros funcionó para mí:
http://www.codeproject.com/Tips/341645/Referenced-assembly-does-not-have-a-strong-name
EDITAR : 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 :
Ejecute el indicador de comandos de Visual Studio y vaya al directorio donde se encuentra su DLL.
For Example my DLL is located in
D:/hiren/Test.dll
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)Generar nueva clave para firmar tu proyecto.
D:/hiren> sn -k mykey.snk
Ahora firma tu biblioteca usando el comando
ilasm
.D:/hiren> ilasm /dll /key=mykey.snk Test.il
He escrito una herramienta para ensamblar automáticamente signos de nombre seguro, incluidos los que no tiene el código fuente o los proyectos que se han abandonado. 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 instrucciones fechadas.
http://brutaldev.com/post/2013/10/18/NET-Assembly-Strong-Name-Signer
Espero que esto ayude a cualquiera que necesite firmar una asamblea de terceros sin tener que saltar a través de aros para llegar allí.
La eliminación de la marca de verificación "Firmar el ensamblaje" debajo de la pestaña "Firmar" funciona como dijo @Michal Stefanow.
Agregar aquí es la forma más sencilla 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 compilació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 los archivos de otras personas o sus propios archivos y tantos como desee.
Me encontré con esto con un dll ServiceStack que había instalado con nuget. Resulta que había otro conjunto de archivos DLL disponibles que estaban etiquetados como firmados. No va a ser la respuesta para todos, pero es posible que solo necesite verificar una versión firmada existente de su ensamblaje.
Para evitar este error usted podría:
- Cargue el ensamblaje dinámicamente, o
- Firma la asamblea de terceros.
Encontrará instrucciones sobre la firma de ensamblajes de terceros en .NET-fu: Firma de un ensamblaje sin firma (sin firma de retardo) .
Firma de asambleas de terceros
El principio básico para firmar una fiesta de la fiesta es
Desmonte el ensamblaje utilizando
ildasm.exe
y guarde el idioma intermedio (IL):ildasm /all /out=thirdPartyLib.il thirdPartyLib.dll
Reconstruir y firmar el montaje:
ilasm /dll /key=myKey.snk thirdPartyLib.il
Arreglando Referencias Adicionales
Los pasos anteriores funcionan bien a menos que su ensamblaje de terceros ( A.dll ) haga referencia a otra biblioteca ( B.dll ) que también debe 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 firma 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 te dará la siguiente salida:
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. A continuación, debe buscar en la 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
}
Para mí, mi problema fue que tenía dos de los mismos paquetes NuGet instalados con diferentes versiones.
Puede usar ensamblajes sin firmar si su ensamblaje también está sin firmar.
Tuve este problema para una aplicación que tenía un nombre seguro, luego tuve que cambiarla para hacer referencia a un ensamblado con un nombre que no tiene un nombre seguro, así que desactivé ''Firmar el ensamblaje'' en la sección de firmas de las propiedades del proyecto, pero aún así se quejó. Pensé que tenía que ser un artefacto en alguna parte causando el problema ya que hice todo lo demás correctamente y fue solo eso. Encontré y eliminé la línea: [assembly: AssemblyKeyFile ("yourkeyfilename.snk")] de su archivo assemblyInfo.cs. Entonces no hay quejas de construcción después de eso.