Как использовать атрибут InternalsVisibleTo с сильно названной сборкой?

Я использую атрибут "InternalsVisibleTo" с сборкой, чтобы разоблачить внутренние методы/классы в моем проекте unit test.

Теперь мне нужно установить эту сборку в GAC, поэтому мне нужно дать ей сильное имя. Когда я пытаюсь сделать это, я получаю следующую ошибку в Visual Studio.

Скрепленные подписью сборки должны указывать открытый ключ в своих объявлениях InternalsVisibleTo

Немного Googling привел меня к следующей статье:

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

В этой статье говорится:

"Определите открытый ключ для сборки имени с сильным именем.

В этой статье не говорится, как определить открытый ключ. Где найти открытый ключ для сборки? Кроме того, как только у меня будет открытый ключ, будет ли это правильным способом объявить атрибут?

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

Ответ 1

Чтобы использовать InternalsVisibleTo со строго подписанной сборкой, ваши "друзья" сборки также должны быть подписаны. Открытый токен тестовой сборки должен быть указан как часть значения InternalsVisibleTo.

Обратите внимание, что атрибут не используется для фактической проверки сборки во время компиляции - он только указывает, что запуск проверки -t ime (и проверки -t ime для сборки друга) должен проверять эту идентичность. Поэтому, если вам просто нужно скомпилировать основную сборку, вы можете указать любой токен открытого ключа (например, один из сборок Microsoft, как, например, во всех ссылках на сборки в вашем Web.Config).

Как правило, поскольку вы будете подписывать сборки, вы будете знать открытый ключ. Т.е. если у вас есть файл snk, то sn -t youSnk.snk покажет открытый ключ. Или вы можете выполнить действия, sn -tp {path to assembly} открытого ключа сборки в Visual Studio, чтобы настроить VS на отображение открытого токена для любой сборки, которая использует sn -tp {path to assembly} для получения открытого ключа из сборки. (Если документ пропал, шаги копируются в другой ответ на этот вопрос)

Ответ 2


ОБНОВЛЕНИЕ Май 2019: отлично работает с Visual Studio 2019.


Для всех, кто использует Visual Studio 2017, есть последний метод:

В нашей любимой IDE перейдите в " Инструменты> Внешние инструменты... " и " Добавить " новый инструмент с такими настройками:

  • Название: Получить PublicKey
  • Команда: " C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.2 Tools\sn.exe " (/!\Выберите версию инструмента NETFX, соответствующую вашей версии NETFX сборки, здесь это 4.6.2)
  • Аргументы: -Tp $ (TargetPath)
  • Установите флажок "Использовать окно вывода"

Применить/OK эти изменения.

В "Обозревателе решений" щелкните имя сборки своего проекта, а затем перейдите в " Инструменты> Получить PublicKey ". Окно вывода должно отображать (довольно длинный) открытый ключ вместе с открытым ключом токена.

Наконец, в проекте, который содержит внутренний класс (т.е. протестированный проект), который вы хотите предоставить, откройте файл " AssemblyInfo.cs " и добавьте строку:

[assembly: InternalsVisibleTo ("MyCompany.SolutionName.ProjectName, PublicKey = Вставить сюда ваш открытый ключ")]

/!\Вы должны удалить разрывы строк из вашего открытого ключа.

Это отлично сработало для меня, так что, надеюсь, это поможет и вам!

Ответ 3

Если вы не тестируете свою конфигурацию выпуска, это простой способ:

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