Почему VSTestHost.exe загружает сборку из каталога c:\windows\assembly\temp?
Я разрабатываю сборку, которая должна быть установлена в GAC, и как часть шага после сборки я гарантирую, что GAC будет обновляться после каждой сборки. Если я создаю (Visual Studio) модульный тест (в сборке отдельных тестов) для вызова нового метода в тестируемом классе, затем реализую метод в тестируемом классе (стиль TDD), затем запускаю тест (CTRL R, T) Сборка тестируемой сборки и проекта модульного тестирования (и сборка обновляется в GAC).
Тест не пройден (выдает исключение System.MissingMethodException для нового метода). Если я сейчас отладлю тест, тест пройден, и после этого я смогу запустить тест, и он пройдет.
В рамках моего расследования я добавил бесконечный цикл в тест, а затем запустил его. Я использовал Process Explorer, чтобы найти путь к DLL, которая загружается во время теста. Я обнаружил, что в C:\WINDOWS\assembly\temp\4XY349E7C5 есть дескриптор сборки. Используя трюк, который я нашел здесь, чтобы посмотреть в этом каталоге, я нахожу более старую версию моей dll, чем в GAC, и если я использую Reflector для проверки dll, я нахожу, что она не содержит добавленный мной новый метод, объясняющий исключение MissingMethodException.
Так почему же VSTestHost.exe загружает dll в временный каталог, и есть ли какой-то способ для меня, чтобы убедиться, что используется правильный dll?
1 ответ
Чтение этой статьи указало мне на причину проблемы - VSTestHost.exe сохраняет старую версию сборки загруженной (то есть версию, на которую ссылаются в папке gac \ temp, которая будет выгружена при выходе из VSTestHost).
Решение проблемы состояло в том, чтобы изменить настройку в Инструменты / Параметры / Инструменты тестирования / Выполнение теста - снимите флажок "Поддерживать работу механизма выполнения теста между тестами". Теперь VSTestHost запускает новый экземпляр для каждого запуска теста и загружает правильную версию моей DLL из GAC.