2009-03-23 5 views
25

J'ai un projet C# et un projet de test avec des tests unitaires pour le projet principal. Je veux avoir des méthodes testables internal et je veux les tester sans un objet Accessor magique que vous pouvez avoir avec des projets de test Visual Studio. Je veux utiliser InternalsVisibleToAttribute mais chaque fois que je l'ai fait, je l'ai dû revenir en arrière et regarder comment le faire, que je me rappelle consiste à créer des fichiers clés pour la signature des assemblages, puis en utilisant sn.exe pour obtenir la clé publique etc.Existe-t-il un moyen facile d'utiliser InternalsVisibleToAttribute?

  • est-il un utilitaire qui automatise le processus de création d'un fichier SNK, fixer des projets à signer les assemblées, extraire la clé publique et l'application de la InternalsVisibleTo attribut?

  • Est-il possible d'utiliser l'attribut sans ensembles signés?

Répondre

32

Vous ne devez pas utiliser les ensembles signés à utiliser InternalsVisibleTo. Si vous n'utilisez pas d'assemblages signés, vous pouvez simplement entrer le nom complet de l'assemblage.

Donc, si vous voulez avoir accès à MyAssembly à tester ensemble (MyAssembly.Test) tout ce que vous avez besoin AssemblyInfo.cs pour MyAssembly est le nom de l'ensemble de test comme ceci:

[assembly: InternalsVisibleTo("CompanyName.Project.MyAssembly.Test")] 
13

Brian a raison, mais, Bien entendu, dans certains cas, vous avez un assemblage signé, et vous voulez obtenir la clé publique de cet assemblage.

Obtenir cette clé est en effet assez compliqué.
Par conséquent, j'ai fait ceci:
J'ai customisé mes outils externes dans VS.NET, de sorte que je puisse obtenir la clef publique de l'assemblée du projet courant avec juste un clic de la souris.
Voici comment cela se fait:

  • Dans VS.NET, ouvrez le menu « Outils » et cliquez sur «Outils externes de
  • Une fenêtre qui est appelée « externes outils » ouvrira
  • Cliquez sur Ajouter
  • Pour le titre, tapez 'Obtenir une clé publique'
  • dans 'Command', tapez C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\sn.exe
  • 'Arguments' In, tapez: -Tp $(TargetPath)
  • Assurez-vous de vérifier la « Utilisez la sortie fenêtre » Option

Ensuite, vous construisez le projet, et lorsque vous cliquez sur « Obtenir une clé publique », vous devriez voir la clé publique pour ce projet la fenêtre de sortie.

+1

J'ai aussi utilisé des outils comme [réflecteur] (http://www.reflector.net/) et [ilspy] (http://wiki.sharpdevelop.net/ILSpy.ashx) pour obtenir les mêmes informations que bien –

3

Il existe une autre alternative pour appeler des méthodes internes et utiliser "Reflection".

 BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic; 

     MethodInfo minfo = typeof(BaseClassName).GetMethod("MethodName", bindingFlags); 
     BaseClassName b = new BaseClassName();    
     minfo.Invoke(b, null); 

Ici, je suppose que « NomClasseDeBase » est le nom de la classe d'un autre classlibrary et « NomMéthode » est le nom de la méthode interne.

Questions connexes