Как сделать так, чтобы атрибут InternalsVisibleTo работал, безопасно подписав открытый ключ токена? - PullRequest
9 голосов
/ 25 августа 2011

Я пытаюсь открыть некоторые внутренние компоненты для моего проекта модульного теста, используя:

[assembly: InternalsVisibleTo("MyTest")]

Но я получаю сообщение об ошибке:

Ошибка 1 Ссылка на сборку друга MyTest 'является недействительным.Сборки со строгим именем должны указывать открытый ключ в своих объявлениях InternalsVisibleTo.... / MyClass.cs ...

Когда я назначаю PublicTokenKey вручную:

[assembly: InternalsVisibleTo("MyTest, PublicKeyToken=XxxxxYysakf")]

Решение создается без ошибок.

  1. Зачем мне нужен токен открытого ключа?
  2. Я не уверен, что что-то сломается в производственном процессе, добавив токен открытого ключа.

Итак, Каков наилучший и безопасный способ присвоения открытого ключа моему тестовому проекту?

1 Ответ

7 голосов
/ 25 августа 2011

Я удивлен, что PublicKeyToken даже работает - на моей машине это заставляет меня использовать PublicKey

  1. Причина, по которой вам нужен токен открытого ключа, заключается в том, что сборки со строгими именами могут быть помещены в GAC, который пользуется высоким доверием. Было бы дырой в безопасности, если какая-либо сборка под названием «MyTest» (которая потенциально не заслуживает доверия - например, элемент управления в браузере) могла бы вызвать внутреннюю часть сборки GACed; ему нужен открытый ключ, чтобы предотвратить этот тип взлома.

  2. Это не должно нарушать работу оборудования, даже если сборка не найдена. Этот атрибут используется во время компиляции, а не во время выполнения.

Какой самый безопасный путь?

Если вы действительно беспокоитесь о том, что это может нарушить рабочий код, удалите атрибут во время сборки выпуска:

#if (DEBUG || TEST)
[assembly: InternalsVisibleTo("MyTest, PublicKeyToken=XxxxxYysakf")] 
#endif

Если у вас есть несколько проектов, для которых нужен токен открытого ключа (и у вас есть одна пара ключей, которую вы должны), вы также можете определить файл, такой как AssemblyInfo.global.cs, и добавить его в качестве связанного файла во все ваши проекты. :

class KeyTokens
{
   public const string Global = ", PublicKeyToken=XxxxxYysakf";
}

Это упрощает (особенно если вам нужно использовать PublicKey, который действительно long):

#if (DEBUG || TEST)
[assembly: InternalsVisibleTo("MyTest" + KeyTokens.Global)] 
[assembly: InternalsVisibleTo("HisTest" + KeyTokens.Global)] 
[assembly: InternalsVisibleTo("TheirTest" + KeyTokens.Global)] 
#endif
...