Comment corriger l'erreur « Referenced assembly does not have a strong name »

Comment corriger l’erreur « Referenced assembly does not have a strong name »

Pour éviter cette erreur, vous pouvez soit :

  • Charger l’assembly dynamiquement, ou

  • Signer l’assembly tierce.

Vous trouverez des instructions sur la signature d’assemblies tierces dans .NET-fu: Signing an Unsigned Assembly (Without Delay Signing).

Signature d’assemblies tierces

Le principe de base pour signer une assembly tierce est de :

Désassembler l’assembly à l’aide de ildasm.exe et sauvegarder le langage intermédiaire (IL) :

ildasm /all /out=thirdPartyLib.il thirdPartyLib.dll

Recompiler et signer l’assembly :

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

Correction des références supplémentaires

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

La solution à ce problème est de 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 dans l’IL de A.dll la référence à B.dll et ajouter le jeton comme suit :

.assembly extern /*23000003*/ MyAssemblyName
{


*(Réponse tronquée)*