2009-03-23 26 views
25

Ho un progetto C# e un progetto di test con test unitari per il progetto principale. Voglio testare i metodi internal e voglio testarli senza un oggetto Accessor magico che puoi avere con i progetti di test di Visual Studio. Voglio usare InternalsVisibleToAttribute ma ogni volta che l'ho fatto ho dovuto tornare indietro e cercare come farlo, che ricordo riguarda la creazione di file chiave per firmare gli assembly e quindi usare sn.exe per ottenere la chiave pubblica e così via.C'è un modo semplice per usare InternalsVisibleToAttribute?

  • C'è un programma di utilità che consente di automatizzare il processo di creazione di un file SNK, impostando progetti di firmare le assemblee, estraendo la chiave pubblica, e applicando il InternalsVisibleTo attributo?

  • C'è un modo per utilizzare l'attributo senza assemblee firmati?

risposta

32

Lei non c'è bisogno di utilizzare assembly firmati da usare InternalsVisibleTo. Se non si usano assiemi firmati, è sufficiente inserire il nome completo dell'assieme.

Quindi, se si vuole avere accesso ai MyAssembly a testare il montaggio (MyAssembly.Test) tutto ciò che serve in AssemblyInfo.cs per MyAssembly è il nome del gruppo di test come questo:

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

Brian è giusto, ma, in alcuni casi si dispone di un assembly firmato e si desidera ottenere la chiave pubblica di tale assembly.

Ottenere questa chiave è davvero una seccatura.
Pertanto, ho fatto questo:
Ho personalizzato i miei strumenti esterni in VS.NET, in modo da poter ottenere la chiave pubblica dell'assembly del progetto corrente con un solo clic del mouse.
Questo è come è fatto:

  • In VS.NET, aprire il menu 'Strumenti', e cliccare su 'Strumenti esterni'
  • Una finestra che si chiama ' strumenti esterne' aprirà
  • Fare clic su Aggiungi
  • per il titolo, digitare 'Get chiave pubblica'
  • in 'Command', digitare C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\sn.exe
  • 'Argomenti' in, digitare: -Tp $(TargetPath)
  • Assicurati di controllare l'opzione 'uscita finestra Utilizzare'

Poi, si genera il progetto, e quando si fa clic su 'Get chiave pubblica', si dovrebbe vedere la chiave pubblica per questo progetto in la finestra di output.

+1

Ho anche utilizzato strumenti come [reflector] (http://www.reflector.net/) e [ilspy] (http://wiki.sharpdevelop.net/ILSpy.ashx) per ottenere le stesse informazioni di bene –

3

Esiste un'altra alternativa per chiamare i metodi interni e che sta utilizzando "Reflection".

 BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic; 

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

Qui mi suppone che "NomeClasseBase" è il nome della classe da un altro ClassLibrary e "MethodName" è il nome del metodo interno.

Problemi correlati