Come si corregge l’errore “L’assembly di riferimento non ha un nome sicuro”?

Ho aggiunto un assembly debolmente denominato al mio progetto Visual Studio 2005 (che è fortemente chiamato). Ora sto ottenendo l’errore:

“Assieme di riferimento” xxxxxxxx “non ha un nome sicuro”

Devo firmare questa assemblea di terze parti?

Per evitare questo errore potresti:

  • Caricare l’assieme in modo dinamico o
  • Firmare l’assemblaggio di terze parti.

Troverai le istruzioni per la firma di assembly di terze parti in .NET-fu: Firma un assembly senza firma (senza firma differita) .

Firma di assembly di terze parti

Il principio di base per firmare un party a vent’anni è quello di

  1. Smontare il gruppo usando ildasm.exe e salvare il linguaggio intermedio (IL):

     ildasm /all /out=thirdPartyLib.il thirdPartyLib.dll 
  2. Ricostruisci e firma l’assemblea:

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

Risolvere ulteriori riferimenti

I passaggi precedenti funzionano correttamente a meno che l’assembly ( A.dll ) di terza parte faccia riferimento a un’altra libreria ( B.dll ) che deve anche essere firmata. È ansible disassemblare, ribuild e firmare sia A.dll che B.dll utilizzando i comandi precedenti, ma durante il runtime, il caricamento di B.dll non verrà eseguito poiché A.dll è stato originariamente creato con un riferimento alla versione senza firma di B.dll .

La correzione a questo problema consiste nel patch del file IL generato nel passaggio 1 sopra. Sarà necessario aggiungere il token della chiave pubblica di B.dll al riferimento. Ottieni questo token chiamando

 sn -Tp B.dll 

che ti darà il seguente risultato:

 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 

L’ultima riga contiene il token della chiave pubblica. Quindi devi cercare l’IL di A.dll per il riferimento a B.dll e aggiungere il token come segue:

 .assembly extern /*23000003*/ MyAssemblyName { .publickeytoken = (A8 A7 ED 72 03 D8 7B C9 ) .ver 10:0:0:0 } 

Espandere il file di progetto che utilizza il progetto che non “ha una chiave con un nome sicuro” e cercare il file .snk (.StrongNameKey).

Sfoglia questo file in Windows Explorer (solo per sapere dove si trova).

Di nuovo in Visual Studio nel progetto che non “ha un nome sicuro”, do

  • Fare clic con il tasto destro sul file di progetto
  • Seleziona Proprietà
  • Seleziona “Scheda firma” (a sinistra)
  • Fai clic sulla casella di controllo “Firma l’assemblea”
  • Quindi & ltBrowse> nel file .snk che hai trovato in precedenza

Questo dovrebbe fare il trucco. Questo ha risolto un problema per me per un progetto utilizzando un modulo all’interno di un altro progetto nella stessa soluzione.

Spero possa essere d’aiuto.

Ero alla ricerca di una soluzione allo stesso problema e l’opzione “Firma l’assieme” non ticchettante funziona per me:

inserisci la descrizione dell'immagine qui

(come si può notare lo screenshot proviene da VS2010 ma si spera che possa aiutare qualcuno)

Ho scritto uno strumento per assemblare automaticamente i nomi dei segni, compresi quelli per i quali non si ha il codice sorgente oi progetti che sono stati abbandonati. Utilizza molte delle tecniche descritte nelle risposte in modo semplice, senza i difetti o gli svantaggi degli strumenti esistenti o delle istruzioni datate.

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

Spero che questo aiuti qualcuno che ha bisogno di firmare un assemblaggio di terze parti senza dover saltare attraverso i cerchi per arrivarci.

È ansible utilizzare assembly non firmati se anche il proprio assieme non è firmato.

La firma dell’assemblea di terze parti ha funzionato per me:

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

EDIT : ho imparato che è utile pubblicare dei passaggi nel caso in cui l’articolo collegato non sia più valido. Tutto il merito va a Hiren Khirsaria :

  1. Esegui prompt dei comandi di Visual Studio e vai alla directory in cui si trova la tua DLL.

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

  2. Ora crea il file IL usando il comando seguente.

    D:/hiren> ildasm /all /out=Test.il Test.dll (questo comando genera la libreria di codici)

  3. Genera una nuova chiave per firmare il tuo progetto.

    D:/hiren> sn -k mykey.snk

  4. Ora firma la tua libreria usando il comando ilasm .

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

Come firmare un assembly di terze parti non firmato

  1. Apri il Prompt dei comandi dello sviluppatore per Visual Studio. Questo strumento è disponibile nei programmi di Windows e può essere trovato utilizzando la ricerca di Windows predefinita.
  2. Assicurati che il tuo prompt abbia accesso ai seguenti strumenti eseguendoli una volta: sn ildasm e ilasm
  3. Passare alla cartella in cui si trova il Cool.Library.dll
  4. sn –k Cool.Library.snk per creare una nuova coppia di chiavi
  5. ildasm Cool.Library.dll /out:Cool.Library.il per smontare la libreria
  6. move Cool.Library.dll Cool.Library.unsigned.dll per mantenere la libreria originale come backup
  7. ilasm Cool.Library.il /dll /resource=Cool.Library.res /key=Cool.Library.snk per riassemblare la libreria con un nome 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" per ottenere il nome completo dell’assembly. Avrai bisogno di questo bit se devi fare riferimento alla DLL in file di configurazione esterni come web.config o app.config.

Ho avuto questo problema per un’app che era stata chiamata con il nome e che dovevo cambiarla per fare riferimento a un assembly non fortemente denominato, quindi ho deselezionato ‘Firma l’assembly’ nella sezione Firma delle proprietà del progetto ma si è comunque lamentato. Ho pensato che dovesse essere un artefatto da qualche parte a causare il problema da quando ho fatto tutto il resto correttamente ed era proprio quello. Ho trovato e rimosso la linea: [assembly: AssemblyKeyFile (“yourkeyfilename.snk”)] dal suo file assemblyInfo.cs. Quindi nessun reclamo di costruzione dopo quello.

Mi sono imbattuto in questo con una dll ServiceStack che avevo installato con nuget. È venuto fuori che c’era un altro set di DLL che erano etichettate come firmate. Non sarà la risposta per tutti, ma potrebbe essere necessario verificare la presenza di una versione firmata esistente dell’assieme. ServiceStack.Signed

La rimozione del segno di spunta “Firma il gruppo” nella scheda “Firma” funziona come ha detto @Michal Stefanow.

Aggiungi qui è il modo più semplice per firmare i tuoi file e / o file di altre persone. Hai solo bisogno di aggiungere questa linea sotto la “riga di comando dell’evento post-build”:

 "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)" 

Puoi firmare i file di altre persone o i tuoi file e quanti ne desideri.

inserisci la descrizione dell'immagine qui

Vecchia domanda, ma sono sorpreso che nessuno abbia ancora parlato di ilmerge. ilmerge è di Microsoft, ma non viene fornito con VS o SDK. Puoi scaricarlo da qui però. C’è anche un repository github . Puoi anche installare da nuget:

 PM>Install-Package ilmerge 

Usare:

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

Se necessario, puoi generare il tuo file di chiavi usando sn (da VS):

 sn -k key.snk 

Per me il mio problema era che avevo due degli stessi pacchetti NuGet installati con versioni diverse.