Як оголосити про збори друзів?


114

У мене є 2 проекти у вирішенні:

  1. Асамблея (Базова бібліотека)
  2. Тестова збірка (NUnit)

Я оголосив тестову збірку як збірку друзів у першому проекті:

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

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

Довідка про збори друзів "Company.Product.Tests" недійсна. Асамблеї, підписані сильним іменем, повинні вказувати відкритий ключ у своїх деклараціях InternalsVisibleTo.

Я намагався витягнути відкритий ключ із мого файлу snk за допомогою утиліти sn, але він генерує дротовий двійковий файл, який я не знаю, як ним користуватися. Як можна виправити проблему?

Відповіді:


194

Вам потрібно підписати обидві збірки, оскільки ефективно обидві збірки посилаються один на одного.

Ви повинні поставити відкритий ключ в атрибут 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

7
І це чертовски дратує бачити в документації MSDN ( msdn.microsoft.com/en-us/library / ... ) згадати сміховинно короткий відкритий ключ , який майже виглядати відкритий ключ лексеми для мене.
Гемант

3
Ви можете витягнути відкритий ключ безпосередньо з .snk-файлу: sn -k MyStrongnameKey.snk // sn -p MyStrongnameKey.snk public.pk // sn -tp public.pk //
Тим Лонг

1
Я використовував "назва збірки", вказану в AssemblyInfo.cs. З цього часу виведене правильне ім'я для використання - це "ім'я збірки" у діалоговому вікні "Властивості / додаток" проекту (що знову відрізняється від назви проекту в досліднику рішень Visual Studio).
Полковник Паніка

7
Настільки ж корисними, як ці відповіді та коментарі, мені знадобився певний експеримент, щоб зрозуміти, що відкритий ключ - це той, який складається з збірки, що містить тести, а не збірка, що містить декларацію "InternalsInvisibleTo".
Андреас

3
@Andreas: Ну це супроводжується збіркою, яку ви іменуєте - ви вказуєте сильну назву збірки, якій слід довіряти, у межах збірки, яка виконує довіру.
Джон Скіт

-3

Ви можете безпосередньо отримати 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))));

1
Це не відповідь на це питання. Це має бути коментар до відповіді, на яку він звертається
Коул Джонсон

-7

Я думаю, вам потрібно вписати чітке ім'я, яке було б на кшталт "Company.Product.Tests, Версія = 1.0.0.0, Культура = нейтральна, PublicKeyToken = 17135d9fcba0119f". Я припускаю, що Company.Product.Tests - це ваша назва збірки, а 17135d9fcba0119f - це відкритий ключ.

Іншим способом вирішення цієї проблеми було б не використання окремих збірок. Зазвичай я кладу вихідний код і код тестування в одну збірку. Я не знаю, чи є у вас особливі занепокоєння, що ви повинні їх розділити.


Я не думаю, що нам потрібно вказати номер версії та культуру (див. Msdn.microsoft.com/en-us/library/… ). Я справді не намагався поставити тестовий код у самій збірці. Спробуємо подивитися, як це працює (+1 для підказки).
Хемант

4
Для InternalsVisibleTo, PublicKeToken недостатньо. Вам потрібен весь відкритий ключ :-(
Шон Рейлі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.