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?
Pour éviter cette erreur, vous pouvez soit:
Vous trouverez des instructions sur la signature d'assemblys tiers dans .NET-fu: signature d'un assemblage non signé (sans signature différée) .
Le principe de base pour signer un trep-party est de
Démontez l'assemblage à l'aide de ildasm.exe
et sauvegardez le langage intermédiaire (IL):
ildasm /all /out=thirdPartyLib.il thirdPartyLib.dll
Reconstruisez et signez l'Assemblée:
ilasm /dll /key=myKey.snk thirdPartyLib.il
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
}
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",
<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.
Je cherchais une solution au même problème et décocher l'option "Signer l'assemblage" fonctionne pour moi:
(vous remarquerez peut-être que la capture d'écran provient de VS2010, mais j'espère que cela aidera quelqu'un)
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.
Vous pouvez utiliser des assemblages non signés si votre assemblage est également non signé.
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 :
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
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)
Générez une nouvelle clé pour signer votre projet.
_D:/hiren> sn -k mykey.snk
_
Maintenant, signez votre bibliothèque en utilisant la commande ilasm
.
_D:/hiren> ilasm /dll /key=mykey.snk Test.il
_
sn
ildasm
et ilasm
sn –k Cool.Library.snk
pour créer une nouvelle paire de clésildasm Cool.Library.dll /out:Cool.Library.il
pour démonter la bibliothèquemove Cool.Library.dll Cool.Library.unsigned.dll
pour conserver la bibliothèque d'origine en tant que sauvegardeilasm Cool.Library.il /dll /resource=Cool.Library.res /key=Cool.Library.snk
pour réassembler la bibliothèque avec un nom fortpowershell -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.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.
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.
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
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
En ce qui me concerne, le problème était que deux des mêmes packages NuGet étaient installés avec des versions différentes.
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.