Jak zadeklarować Zgromadzenie przyjaciół?

Mam 2 projekty w moim rozwiązaniu:

  1. Assembly (Basic Library)
  2. Test Assembly (NUnit)

Zadeklarowałem test assembly jako friends assembly w pierwszym projekcie:

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

Wszystko działało dobrze, dopóki nie zdałem sobie sprawy, że zapomniałem skonfigurować rozwiązanie do podpisywania moich zespołów. Tak powstał plik snk i skonfigurować projekt visual studio, aby podpisać pierwszy montaż (Biblioteka Podstawowa). Teraz kiedy kompiluję pierwszy projekt, dostaję następujący błąd:

Friend assembly reference "Firma.Produkt.Testy " są nieważne. Strong-name signed assemblies must określ klucz publiczny w ich Wewnętrzne deklaracje.

Próbowałem wyodrębnić klucz publiczny z mojego pliku snk za pomocą narzędzia sn, ale generuje on przewodowy plik binarny, którego nie jestem pewien, jak go użyć. Jak mogę rozwiązać problem?

Author: Hemant, 2009-07-14

3 answers

Musisz podpisać oba zespoły, ponieważ skutecznie oba zespoły odwołują się do siebie.

Musisz umieścić klucz publiczny w atrybucie InternalsVisibleTo. Na przykład w buforach protokołu używam:

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

Klucz publiczny jest pobierany przez uruchomienie

sn -Tp path\to\test\assembly.dll
/ Align = "left" / plik snk:
sn -p MyStrongnameKey.snk public.pk
sn -tp public.pk
 195
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-30 18:24:13

Możesz bezpośrednio uzyskać dostęp do zgromadzeń, które Cię interesują, bez magii z sn.exe

<!-- language: c# -->
var assemblyName = Assembly.GetExecutingAssembly().GetName();
Console.WriteLine("{0}, PublicKey={1}",
    assemblyName.Name,
string.Join("", assemblyName.GetPublicKey().Select(m => string.Format("{0:x2}", m))));
 -3
Author: ezyuzin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-08 13:01:51

Myślę, że trzeba wpisać mocną nazwę, która byłaby czymś w rodzaju " firma.Produkt.Testy, Wersja=1.0.0.0, Kultura = neutralny, PublicKeyToken = 17135d9fcba0119f". Zakładam Towarzystwo.Produkt.Tests to nazwa Twojego zestawu, a 17135d9fcba0119f to klucz publiczny.

Innym sposobem rozwiązania tego problemu byłoby nie używanie oddzielnych zespołów. Zwykle umieszczam kod źródłowy i kod testowy w tym samym zestawie. Nie wiem, czy macie jakieś szczególne obawy, które musicie rozdzielić. oni.

 -7
Author: user95319,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-14 06:14:02