web-dev-qa-db-fra.com

Comment déclarer un assemblage ami?

J'ai 2 projets dans ma solution:

  1. Assemblage (bibliothèque de base)
  2. Ensemble de test (NUnit)

J'avais déclaré l'Assemblée d'essai comme Assemblée d'amis dans le premier projet:

[Assembly: InternalsVisibleTo ("Company.Product.Tests")]

Tout fonctionnait bien jusqu'à ce que je réalise que j'ai oublié de configurer la solution pour signer mes assemblages. J'ai donc créé un fichier snk et configuré le projet Visual Studio pour signer le premier assemblage (bibliothèque de base). Maintenant, quand je compile le premier projet, j'obtiens l'erreur suivante:

La référence d'assembly ami "Company.Product.Tests" n'est pas valide. Les assemblys signés avec un nom fort doivent spécifier une clé publique dans leurs déclarations InternalsVisibleTo.

J'ai essayé d'extraire la clé publique de mon fichier snk à l'aide de l'utilitaire sn, mais il génère un fichier binaire câblé que je ne sais pas comment utiliser. Comment puis-je résoudre le problème?

108
Hemant

Vous devez signer les assemblys both, car les deux assemblages se référencent efficacement.

Vous devez mettre la clé publique dans l'attribut InternalsVisibleTo. Par exemple, dans les tampons de protocole que j'utilise:

[Assembly:InternalsVisibleTo("Google.ProtocolBuffers.Test,PublicKey="+
"00240000048000009400000006020000002400005253413100040000010001008179f2dd31a648"+
"2a2359dbe33e53701167a888e7c369a9ae3210b64f93861d8a7d286447e58bc167e3d99483beda"+
"72f738140072bb69990bc4f98a21365de2c105e848974a3d210e938b0a56103c0662901efd6b78"+
"0ee6dbe977923d46a8fda18fb25c65dd73b149a5cd9f3100668b56649932dadd8cf5be52eb1dce"+
"ad5cedbf")]

La clé publique est récupérée en exécutant

sn -Tp path\to\test\Assembly.dll

Vous pouvez également l'obtenir à partir du fichier .snk:

sn -p MyStrongnameKey.snk public.pk
sn -tp public.pk
187
Jon Skeet