Подтвердить что ты не робот

Есть ли простой способ использовать InternalsVisibleToAttribute?

У меня есть проект С# и тестовый проект с модульными тестами для основного проекта. Я хочу иметь тестовые методы internal, и я хочу протестировать их без магического объекта Accessor, который вы можете использовать в тестовых проектах Visual Studio. Я хочу использовать InternalsVisibleToAttribute, но каждый раз, когда я это делал, мне приходилось возвращаться и искать, как это сделать, что, как я помню, включает в себя создание файлов ключей для подписания сборок, а затем используя sn.exe, чтобы получить открытый ключ и т.д.

  • Есть ли утилита, которая автоматизирует процесс создания файла SNK, установки проектов для подписи сборок, извлечения открытого ключа и применения атрибута InternalsVisibleTo?

  • Есть ли способ использовать атрибут без подписанных сборок?

4b9b3361

Ответ 1

Вам не нужно использовать подписанные сборки для использования InternalsVisibleTo. Если вы не используете подписанные сборки, вы можете просто ввести полное имя сборки.

Итак, если вы хотите иметь доступ к MyAssembly в тестовой сборке (MyAssembly.Test), все, что вам нужно в AssemblyInfo.cs для MyAssembly, - это имя тестовой сборки, например:

[assembly: InternalsVisibleTo("CompanyName.Project.MyAssembly.Test")]

Ответ 2

Брайан прав, но в некоторых случаях у вас есть подписанная сборка, и вы хотите получить открытый ключ этой сборки.

Получение этого ключа действительно довольно хлопот.
Поэтому я сделал это:
Я настроил свои внешние инструменты в VS.NET, так что я могу получить открытый ключ сборки текущего проекта всего одним щелчком мыши.
Вот как это делается:

  • В VS.NET откройте меню "Инструменты" и нажмите "Внешние инструменты"
  • Окно, которое называется "Внешнее инструменты "откроется
  • Нажмите "Добавить"
  • Для названия введите "Получить открытый ключ"
  • В 'Command' введите C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\sn.exe
  • В "Аргументах" введите: -Tp $(TargetPath)
  • Убедитесь, что вы проверили "Использовать вывод окно "

Затем вы создаете проект, и когда вы нажимаете "Получить открытый ключ", вы должны увидеть открытый ключ для этого проекта в окне вывода.

Ответ 3

Существует еще один альтернативный вызов внутренних методов, который использует "Отражение".

        BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic;

        MethodInfo minfo = typeof(BaseClassName).GetMethod("MethodName", bindingFlags);
        BaseClassName b = new BaseClassName();            
        minfo.Invoke(b, null);

Здесь я предполагаю, что "BaseClassName" - это имя класса из другой библиотеки классов, а "MethodName" - это имя внутреннего метода.