2015-06-19 31 views
6

Używam atrybutu "InternalsVisibleTo" w zespole do ujawnienia wewnętrznych metod/klas do mojego projektu testu jednostkowego.Jak korzystać z atrybutu "InternalsVisibleTo" z silnie nazwanym złożeniem?

Muszę teraz zainstalować ten zestaw w GAC, więc muszę nadać mu silne imię. Kiedy próbuję to zrobić, pojawia się następujący błąd w Visual Studio.

Strong-name podpisane zespoły muszą określić klucz publiczny w swoich deklaracjach InternalsVisibleTo

Trochę Googling przyniósł mi do artykułu poniżej:

https://msdn.microsoft.com/en-us/library/bb763089.aspx

Artykuł ten stanowi:

"Określić warunki klucz do bliskiego zgromadzenia przyjaciół. "

W tym artykule nie podano sposobu określenia klucza publicznego. Gdzie znajdę klucz publiczny do montażu? Ponadto, gdy już mam klucz publiczny, czy byłby to właściwy sposób deklarowania atrybutu?

[assembly: InternalsVisibleTo("Namespace.Assembly.Example.Name, PublicKey=ThePublicKey")] 
+0

Google "klucz publiczny zespołu .net" i wykonaj pierwsze trafienie. –

+0

Próbowałem tego. Mówi o użyciu SN.exe, ale działa to tylko wtedy, gdy złożenie jest mocno podpisane. Nie mogę zmusić zespołu do kompilacji, ponieważ jest mocno napisany z powodu powyższego błędu. SN.exe daje błąd ".dll nie reprezentuje mocno nazwanego zestawu" – Dave

+2

Wygląda na to, że masz odwrócony kurczak i jajko, potrzebujesz klucza publicznego zespołu * innego *. –

Odpowiedz

8

Aby korzystać InternalsVisibleTo z silnie podpisał montaż twoi „przyjaciele” zespoły muszą być podpisane zbyt mocno.

Należy zauważyć, że atrybut nie jest używany do faktycznego sprawdzania poprawności złożenia podczas kompilacji - określa tylko, że sprawdzanie w czasie działania (i sprawdzanie podczas kompilacji dla zespołu znajomego) powinno potwierdzać tę tożsamość. Jeśli więc chcesz po prostu musisz skompilować główny zespół, możesz określić dowolny token klucza publicznego (tj. Jeden z zespołów Microsoft, jak na przykład we wszystkich odniesieniach do zestawów w twoim Web.Config na przykład).

Generalnie od kiedy będziesz podpisywać zjazdy, będziesz znał klucz publiczny. To znaczy. jeśli masz plik snk niż sn -t youSnk.snk, pokaże się klucz publiczny. Lub możesz wykonać kroki w Getting Public Key Token of Assembly Within Visual Studio, aby skonfigurować swoją VS do wyświetlania publicznego tokena dla dowolnego zespołu.

1

Jeśli nie przetestować konfigurację uwalniania, jest to łatwe obejście:

#if DEBUG 
[assembly: InternalsVisibleTo("TestProjNamespace")] 
#endif 
7

każdemu, kto jest przy użyciu programu Visual Studio 2017, to najnowsza metoda:

Z naszego ukochanego IDE przejdź do „Narzędzia> Narzędzia zewnętrzne ...” i „Dodaj” nowe narzędzie z tymi ustawieniami:

  • Tytuł: Get PublicKey
  • Polecenie: "C: \ Program Files (x86) \ Microsoft SDK \ Windows \ v10.0A \ bin \ NETFX 4.6.2 Tools \ sn.exe" (/ \ wybierać wersja narzędzia NETFX, która pasuje do twojej wirtualnej wersji NETFX, tutaj jest 4.6.2)
  • Argumenty: -Tp $ (TargetPath)
  • Zaznacz pole wyboru "Użyj okno Output"

Zastosuj/OK te zmiany.

W „Solution Explorer” kliknięcie Nazwa projektu montażowego, a następnie udać się do „Narzędzia> Pobierz PublicKey”. W oknie Wyjście powinien zostać wyświetlony (dość długi) klucz publiczny wraz z kluczem klucza publicznego.

Ostatecznie w projekcie, który posiada klasę wewnętrzną (tzn badanego projektu) chcesz się narażać, otwórz „AssemblyInfo.cs” plik i dodać linię:

[montaż: InternalsVisibleTo ("MyCompany.SolutionName.ProjectName, PublicKey = Wklej klucz publiczny tutaj")]

/! \ trzeba usunąć linia zrywa z kluczem publicznym.

Udało mi się to doskonale, więc mam nadzieję, że to również ci pomoże!

+1

Pracował również w Visual Studio 2015 :) – Kzrystof

+0

Przydatne. Dzięki. – qwertoyo