Есть ли простой способ использовать InternalsVisibleToAttribute?
У меня есть проект С# и тестовый проект с модульными тестами для основного проекта. Я хочу иметь тестовые методы internal
, и я хочу протестировать их без магического объекта Accessor, который вы можете использовать в тестовых проектах Visual Studio. Я хочу использовать InternalsVisibleToAttribute
, но каждый раз, когда я это делал, мне приходилось возвращаться и искать, как это сделать, что, как я помню, включает в себя создание файлов ключей для подписания сборок, а затем используя sn.exe
, чтобы получить открытый ключ и т.д.
-
Есть ли утилита, которая автоматизирует процесс создания файла SNK, установки проектов для подписи сборок, извлечения открытого ключа и применения атрибута InternalsVisibleTo?
-
Есть ли способ использовать атрибут без подписанных сборок?
Ответы
Ответ 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" - это имя внутреннего метода.