112 votes

Comment déclarer une assemblée d'ami?

J'ai 2 projets dans ma solution:

  1. De L'Assemblée (Base De La Bibliothèque)
  2. Montage D'Essai (NUnit)

J'avais déclaré le montage d'essai comme des amis de l'assemblée en première projet:

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

Tout fonctionnait bien, jusqu'à ce que je réalise que j'ai oublié de configuration de la solution de signer mon assemblées. Donc créé un fichier snk et de configuration du projet visual studio pour signer la première assemblée (Base de la Bibliothèque). Maintenant, quand je compile le premier projet, j'obtiens le message d'erreur suivant:

Ami de l'assemblée de référence La société".Produit.Les Tests' est pas valide. Nom signé assemblées doivent spécifier une clé publique dans leur InternalsVisibleTo déclarations.

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

192voto

Jon Skeet Points 692016

Vous devez signer les deux assemblages, car ces derniers se référencent.

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
 

-7voto

user95319 Points 234

Je pense que vous devez indiquer le nom fort, qui devrait ressembler à "Company.Product.Tests, Version = 1.0.0.0, Culture = neutre, PublicKeyToken = 17135d9fcba0119f". Je suppose que Company.Product.Tests est le nom de votre assemblage et 17135d9fcba0119f est la clé publique.

Une autre façon de résoudre ce problème serait de ne pas utiliser d’assemblages séparés. Je mets généralement le code source et le code de test dans le même assemblage. Je ne sais pas si vous êtes particulièrement préoccupé par le fait de les séparer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X