Как объявить дружбу сборкой? - PullRequest
106 голосов
/ 14 июля 2009

В моем решении 2 проекта:

  1. Сборка (базовая библиотека)
  2. Испытательная сборка (NUnit)

Я объявил тестовую сборку как сборку друзей в первом проекте:

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

Все работало нормально, пока я не понял, что забыл настроить решение для подписи своих сборок. Поэтому создали файл snk и настроили проект Visual Studio для подписания первой сборки (Basic Library). Теперь, когда я компилирую первый проект, я получаю следующую ошибку:

Ссылка на сборку друга «Company.Product.Tests» является недействительным. Собрания со строгим именем должны указать открытый ключ в их InternalsVisibleTo объявлений.

Я пытался извлечь открытый ключ из моего snk-файла, используя утилиту sn, но он генерирует двоичный файл с проводной связью, который я не знаю, как его использовать. Как я могу решить проблему?

Ответы [ 3 ]

186 голосов
/ 14 июля 2009

Необходимо подписать обе сборки, потому что фактически обе сборки ссылаются друг на друга.

Вы должны поместить открытый ключ в атрибут InternalsVisibleTo. Например, в буферах протокола я использую:

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

Открытый ключ извлекается с помощью команды

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

Либо получите его из файла .snk:

sn -p MyStrongnameKey.snk public.pk
sn -tp public.pk
0 голосов
/ 08 февраля 2015

Вы можете напрямую получить publicKey из сборки, которая вас интересует, без магии с 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))));
0 голосов
/ 14 июля 2009

Я думаю, вам нужно ввести строгое имя, которое будет выглядеть примерно так: «Company.Product.Tests, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = 17135d9fcba0119f». Я предполагаю, что Company.Product.Tests - это имя вашей сборки, а 17135d9fcba0119f - открытый ключ.

Другим способом решения этой проблемы было бы не использовать отдельные сборки. Я обычно помещаю исходный код и код тестирования в одну сборку. Я не знаю, есть ли у вас особые опасения, что вы должны разделить их.

...