Что может быть причиной System.Исключение TypeLoadException в модульном тестировании Visual Studio?

#c# #visual-studio-2010 #vs-unit-testing-framework

#c# #visual-studio-2010 #vs-unit-testing-framework

Вопрос:

У меня есть библиотека классов C # .NET MyClassLibrary, которая отлично компилируется. Я пытаюсь создать для него проект модульного тестирования (используя Visual Studio Unit Testing Framework с Visual Studio 2010). В библиотеке классов действительно есть большие классы, но всякий раз, когда я запускаю даже самый простой тест против самого простого класса, я получаю следующее исключение:

Метод тестирования MyClassLibraryTest.MyClassLibraryTests.Mysimpleclassstest выдал исключение: System.Исключение TypeLoadException: не удалось загрузить тип ‘MyClassLibrary.MySimpleClass’ из сборки ‘MyClassLibrary, версия = 1.0.0.0, Культура = нейтральная, PublicKeyToken = null’.

Все проекты, с которыми я имею дело, находятся в одном решении, и все они скомпилированы для .NET 4.0. Все это на 64-разрядном компьютере с Windows 7.

Вот странная часть: когда я «Запускаю» тест, я получаю указанную выше ошибку. Но когда я «Отлаживаю» тест, он выполняется нормально. Почему?

Комментарии:

1. MySimpleClass не определен в сборке или у него проблемы с загрузкой. Можете ли вы показать исходный код для этого класса?

2. Как я уже сказал, при отладке все прошло нормально. Не должно иметь значения, каково определение для MySimpleClass; ЛЮБОЙ класс из проекта не загружается в режиме выполнения. Я не могу подогнать ни один приведенный здесь код, но я предполагаю, что это проблема конфигурации сборки (или настройки visual Studio, или что-то в этом роде), а не проблема с кодом.

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

Ответ №1:

Я просто битый час бился головой об это. Проблема заключалась в том, что у меня был проект командной строки с именем Something.exe , в котором использовался проект библиотеки классов с именем Something.dll.

Комментарии:

1. Здесь то же самое. Спасибо, Амир. Я все еще не понимаю, почему наличие . dll и .exe одинаковые, вызывающие ошибку

2. Поскольку из соображений производительности . NET runtime предполагает, что это MyAssembly находится либо в MyAssembly.dll , либо MyAssembly.exe (вместо сканирования слишком большого количества файлов). Это особенность языка, благодаря которой вы можете загрузить .exe в свое приложение как любую другую сборку (я использовал это несколько раз). Поэтому, когда . NET runtime пытается загрузить, MyAssembly пытается MyAssembly.exe , видит, что это допустимо. СЕТЕВАЯ сборка загружает ее и не может найти соответствующий класс.

3. Небольшая ошибка в последнем комментарии — MyAssembly уже загружено, поскольку мы выполнили MyAssembly.exe .

Ответ №2:

Со мной тоже случилось. В моем случае проблема возникла из-за того, что тестируемый проект и проект модульных тестов имели одинаковое имя. Если это и ваш случай, то переименуйте один из проектов и переименуйте имя выходного файла, чтобы исправить это.

Комментарии:

1. к вашему сведению: название моего проекта было другим. Но в настройках имя сборки / пространство имен по умолчанию было таким же.

2. У меня была та же проблема — я переименовал проект на другое имя, затем создал другой проект, используя старое имя. Спасибо, что указали на это!

3. @dknaack 4 года спустя все еще спасает жизни! Спасибо!

Ответ №3:

Сборка MyClassLibrary была переведена в режим x86 в диспетчере конфигурации. Изменение этого на x64 исправило это. Я действительно хотел бы, чтобы Visual Studio обнаружила это и сообщила об этом как о менее неясной ошибке.

Ответ №4:

Со мной тоже случилось. Это связано со сборкой для x64, Release и x86 режима. В моем случае я удалил папки в своей корзине (debug / release / x86 в ссылочных сборках и модульном тестировании) и повторно запустил свой модульный тест. VS2010 несколько раз сообщал об ошибке в окне вывода. Это решило проблему для меня.

Ответ №5:

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

Мое основное название проекта было: Calculator.OperationsManager название моего тестового проекта было: Calculator.OperationsManager

я изменил название тестового проекта на Calculator.OperationsManager.Протестируйте, и все прошло хорошо.

Комментарии:

1. Здесь то же самое. У двух проектов было одинаковое пространство имен по умолчанию, и возникла эта проблема.

Ответ №6:

Прошел через это сегодня, и хотя я бы оставил свое исправление.

Спецификации: VS 2013 / .Net 4.0

Решение: Перейдите в меню> Тест> Настройки тестирования> Архитектура процессора по умолчанию> X64

введите описание изображения здесь

Ответ №7:

Здесь то же сообщение, но я также не смог отладить тест.

В моем случае тестируемая мной DLL была развернута в GAC (требование BizTalk). Я создал новый класс и тестировал его, но не загружал DLL снова с момента добавления тестируемого класса.

Ответ №8:

На случай, если это поможет другим с той же ошибкой (я понимаю, что это напрямую не отвечает на вопрос re Release vs Debug); Я объединил устаревший проект с пространством имен, которое конфликтовало с существующим, поэтому переименовал его. Я получил эту ошибку при попытке создать форму из этого проекта.

Я проверил, что целевая платформа была такой же, и удалил каталоги .bin , чтобы обеспечить чистую перестройку, удалил ссылку на объединенный проект и повторно добавил его, но все та же ошибка.

В конце концов (!) Я проверил имя сборки в свойствах проекта (щелкните правой кнопкой мыши по проекту, выберите «свойства», выберите вкладку «Приложение») и изменил его, чтобы оно соответствовало пространству имен по умолчанию, и теперь все хорошо.

Ответ №9:

У меня была аналогичная проблема с Trey, но вместо BizTalk у меня есть решение SharePoint, которое также использует развертывание GAC. У GAC была более старая сборка. Когда я удалил сборку GAC, отозвав решение, тест прошел.

Комментарии:

1. Для biztalk повторное развертывание приложения (включая сборки в GAC) сработало

Ответ №10:

У меня была эта ошибка при использовании NUnit 3 в VS 2013. Я решил проблему, удалив ссылку на сборку в моем тестовом проекте для сборки, которая содержала тип, который не был найден, а затем повторно добавил ссылку.

Ответ №11:

На всякий случай, если кому-то это нужно: Я создал тестовый проект в Visual Studio и задавался вопросом, почему некоторые классы не могут быть найдены, даже если Visual Studio неоднократно просила меня добавить «System.Web» в качестве ссылки.

Я сделал это, и ошибка продолжала возникать. Проблема для меня была простой (и я должен был проверить это раньше, я знаю): Я создал тестовый проект из шаблона, который создал проект .NET Core. После изменения его на .NET Framework 4.6.1 и добавления «System.Веб » в качестве ссылки, все работало нормально.

Ответ №12:

Столкнулся с той же проблемой. На всякий случай, если это кому-нибудь поможет — мне удалось заставить его работать, понизив рейтинг пакета nuget NUnit3TestAdapter с версии 3.13.0 до 3.11.2.

Вы можете найти более подробную информацию об этом — https://github.com/nunit/nunit-console/issues/424

Ответ №13:

Это случилось и со мной. У меня был пакет nuget, установленный в моем проекте домена с версией 1.5, но в моем проекте модульного тестирования была только версия 1.1. Я решил проблему, обновив версию в проекте модульного тестирования, чтобы она соответствовала версии в проекте домена (проект, с которым тестируется).

Ответ №14:

В моем случае проблема была вызвана запутанным кодом. Я отключил запутывание кода и решил проблему.