web-dev-qa-db-fra.com

Comment réparer l'erreur "L'assemblée référencée n'a pas de nom fort"?

J'ai ajouté un assemblage faiblement nommé à mon projet Visual Studio 2005 (qui est nommé). Je reçois maintenant l'erreur:

"L'assemblée référencée 'xxxxxxxx' n'a pas de nom fort"

Dois-je signer cette assemblée tierce?

225
ng5000

Pour éviter cette erreur, vous pouvez soit:

  • Charger l'assemblage de manière dynamique, ou
  • Signer la troisième assemblée.

Vous trouverez des instructions sur la signature d'assemblys tiers dans .NET-fu: signature d'un assemblage non signé (sans signature différée) .

Signature d'assemblées tierces

Le principe de base pour signer un trep-party est de

  1. Démontez l'assemblage à l'aide de ildasm.exe et sauvegardez le langage intermédiaire (IL):

    ildasm /all /out=thirdPartyLib.il thirdPartyLib.dll 
    
  2. Reconstruisez et signez l'Assemblée:

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

Fixation de références supplémentaires

Les étapes ci-dessus fonctionnent correctement sauf si votre assemblée tierce ( A.dll ) fait référence à une autre bibliothèque ( B.dll ) qui doit également être signé. Vous pouvez désassembler, reconstruire et signer à la fois A.dll et B.dll en utilisant les commandes ci-dessus, mais lors de l'exécution, le chargement de B.dll échouera car A.dll a été construit à l'origine avec une référence à la version non signée de B.dll .

La solution à ce problème consiste à corriger le fichier IL généré à l'étape 1 ci-dessus. Vous devrez ajouter le jeton de clé publique de B.dll à la référence. Vous obtenez ce jeton en appelant

sn -Tp B.dll 

ce qui vous donnera la sortie suivante:

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 dernière ligne contient le jeton de clé publique. Vous devez ensuite rechercher l'IL de A.dll pour trouver la référence à B.dll et ajoutez le jeton comme suit:

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

Développez le fichier de projet qui est en utilisant le projet qui "n'a pas de clé de nom fort" et recherchez le fichier .snk (.StrongNameKey ).

Accédez à ce fichier dans Explorateur Windows (juste pour que vous sachiez où il se trouve).

De retour dans Visual Studio dans le projet qui n’a pas de "clé de nom fort",

  • Clic droit sur le fichier du projet
  • Sélectionnez Propriétés
  • Sélectionnez "Onglet Signing" (à gauche)
  • Cliquez sur la case à cocher "Signer l'assemblage"
  • Puis <Browse> dans le fichier .snk que vous avez trouvé précédemment.

Cela devrait faire l'affaire. Cela a résolu un problème pour moi pour un projet en utilisant un formulaire dans un autre projet dans la même solution.

J'espère que ça aide.

94
MrOli3000

Je cherchais une solution au même problème et décocher l'option "Signer l'assemblage" fonctionne pour moi:

enter image description here

(vous remarquerez peut-être que la capture d'écran provient de VS2010, mais j'espère que cela aidera quelqu'un)

57
Mars Robertson

J'ai écrit un outil pour automatiser automatiquement les assemblages de signes avec nom fort, y compris ceux pour lesquels vous ne possédez pas le code source ou pour les projets qui ont été abandonnés. Il utilise de manière simple nombre des techniques décrites dans les réponses, sans les inconvénients ni les inconvénients des outils existants ou des instructions obsolètes.

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

J'espère que cela aidera toutes les personnes qui doivent signer une assemblée d'une tierce partie sans avoir à franchir des obstacles pour y parvenir.

45
BrutalDev

Vous pouvez utiliser des assemblages non signés si votre assemblage est également non signé.

40
Alexandr Nikitin

La signature de la troisième Assemblée a fonctionné pour moi:

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

EDIT: J'ai appris qu'il était utile de poster des étapes au cas où l'article lié ne serait plus valide. Tout le crédit va à Hiren Khirsaria :

  1. Exécutez l'invite de la commande visual studio et accédez au répertoire où votre DLL se trouve.

    _For Example my DLL is located in_ D:/hiren/Test.dll

  2. Créez maintenant le fichier IL à l’aide de la commande ci-dessous.

    _D:/hiren> ildasm /all /out=Test.il Test.dll_ (cette commande génère la bibliothèque de code)

  3. Générez une nouvelle clé pour signer votre projet.

    _D:/hiren> sn -k mykey.snk_

  4. Maintenant, signez votre bibliothèque en utilisant la commande ilasm.

    _D:/hiren> ilasm /dll /key=mykey.snk Test.il_

22
mateuscb

Comment signer une assemblée tierce non signée

  1. Ouvrez l'invite de commande de développeur pour Visual Studio. Cet outil est disponible dans vos programmes Windows et peut être trouvé à l'aide de la recherche Windows par défaut.
  2. Assurez-vous que votre invite a accès aux outils suivants en les exécutant une fois: snildasm et ilasm
  3. Accédez au dossier où se trouve votre Cool.Library.dll
  4. sn –k Cool.Library.snk pour créer une nouvelle paire de clés
  5. ildasm Cool.Library.dll /out:Cool.Library.il pour démonter la bibliothèque
  6. move Cool.Library.dll Cool.Library.unsigned.dll pour conserver la bibliothèque d'origine en tant que sauvegarde
  7. ilasm Cool.Library.il /dll /resource=Cool.Library.res /key=Cool.Library.snk pour réassembler la bibliothèque avec un nom fort
  8. powershell -command "& {[System.Reflection.AssemblyName]::GetAssemblyName($args).FullName} Cool.Library.dll" pour obtenir le nom complet de l'assembly. Vous aurez besoin de ce bit si vous devez référencer le DLL dans des fichiers de configuration externes tels que web.config ou app.config.
14
Martin Devillers

J'avais ce problème pour une application qui s'appelait fortement, puis je devais le changer afin de faire référence à une assemblée non nommée, alors j'ai décoché 'Signer l'assemblage' dans la section Signing des propriétés du projet, mais toujours = s'est plaint. Je pensais que ce devait être un artefact quelque part posant le problème puisque je faisais tout le reste correctement et c'était justement cela. J'ai trouvé et supprimé la ligne: [Assembly: AssemblyKeyFile ("yourkeyfilename.snk")] de son fichier assemblyInfo.cs. Ensuite, pas de plaintes de construction après cela.

5
Joe

Je courais dans ceci avec un DLL de ServiceStack que j'avais installé avec le nuget. Il s'avère qu'il y avait un autre ensemble de DLL disponibles étiquetées signées. Ce ne sera pas la solution pour tout le monde, mais il vous suffira peut-être de rechercher une version signée existante de votre Assemblée. ServiceStack.Signed

5
Henry Crans

Vieille question, mais je suis surpris que personne n'ait encore mentionné ilmerge. ilmerge provient de Microsoft, mais n’a pas été livré avec VS ni les SDK. Vous pouvez le télécharger à partir de ici si. Il y a aussi un dépôt github . Vous pouvez aussi installer depuis nuget:

PM>Install-Package ilmerge

Utiliser:

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

Si nécessaire, vous pouvez générer votre propre fichier de clés à l'aide de sn (à partir de VS):

sn -k key.snk
2
Jahmic

Situation: Vous avez eu le projet A, B, C, D dans la solution X, Y

Projet A, B, C en X Projet A, C, D en Y

J'ai besoin d'utiliser le projet C dans le projet A, mais plus tard, je ne l'utilise pas. Dans bin Debug, le projet A avait C.dll.

Si je compile la solution X, tout va bien (dans cette solution je supprime la référence A -> C.), mais dans la solution Y je reçois ce problème.

La solution est delete C.dll dans le projet A Debug bin

1
Martin9032

En ce qui me concerne, le problème était que deux des mêmes packages NuGet étaient installés avec des versions différentes.

1
Demodave

Supprimer la coche "Signer l'assemblage" sous l'onglet "Signer" fonctionne de la manière indiquée par @Michal Stefanow.

Ajouter est le moyen le plus simple de signer vos propres fichiers et/ou les fichiers d'autres personnes. Vous devez juste ajouter cette ligne sous la "ligne de commande de l'événement 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)"

Vous pouvez signer les fichiers d'autres personnes ou vos propres fichiers et autant que vous le souhaitez.

enter image description here

1
Pabinator