Comment déclarer une assemblée d’amis?

J’ai 2 projets dans ma solution:

  1. Assemblée (bibliothèque de base)
  2. Test Assembly (NUnit)

J’avais déclaré l’assemblage de test en tant qu’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 assemblées. Donc créé un fichier snk et configurer le projet Visual Studio pour signer le premier assemblage (Basic Library). Maintenant, quand je comstack le premier projet, j’obtiens l’erreur suivante:

La référence de l’assembly Friend ‘Company.Product.Tests’ n’est pas valide. Les assemblys signés par 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 en utilisant l’utilitaire sn, mais cela génère un fichier binary filaire que je ne sais pas comment utiliser. Comment puis-je résoudre le problème?

Vous devez signer les deux assemblages, car les deux assemblages se réfèrent effectivement l’un à l’autre.

Vous devez placer la clé publique dans l’atsortingbut InternalsVisibleTo. Par exemple, dans les tampons de protocole, j’utilise:

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

La clé publique est extraite en cours d’exécution

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

Sinon, récupérez-le à partir du fichier .snk:

 sn -p MyStrongnameKey.snk public.pk sn -tp public.pk 

Vous pouvez directement obtenir publicKey de l’assemblage qui vous intéresse, sans magie avec sn.exe

  var assemblyName = Assembly.GetExecutingAssembly().GetName(); Console.WriteLine("{0}, PublicKey={1}", assemblyName.Name, ssortingng.Join("", assemblyName.GetPublicKey().Select(m => ssortingng.Format("{0:x2}", m)))); 

Je pense que vous devez mettre le nom fort, qui serait quelque chose comme “Company.Product.Tests, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = 17135d9fcba0119f”. Je suppose que Company.Product.Tests est le nom de votre assemblée et 17135d9fcba0119f est la clé publique.

Une autre façon de résoudre ce problème serait de ne pas utiliser d’assemblages distincts. Je mets généralement le code source et le code de test dans le même assemblage. Je ne sais pas si vous avez une préoccupation particulière à ce que vous deviez les séparer.