nunit при сборке выпуска: среда CLR обнаружила недопустимую программу.

Я обновил наше программное обеспечение с vs2008 / .net 3.5 до vs2010 / .net 4.0. Все сторонние библиотеки (наиболее актуальные: nhibernate 2.1.2 или 3.0.0, nunit 2.5.2) по-прежнему скомпилированы с использованием vs2008. Когда я запускаю модульные тесты для отладочной сборки нашего программного обеспечения, все работает нормально. В сборке выпуска nunit сообщает об исключениях в 33 из 228 тестов: System.InvalidProgramException : Common Language Runtime detected an invalid program. Это всегда происходит в одних и тех же тестах, как для nunit-console, так и для средства запуска тестов Resharper 5.0. Когда я запускаю их с помощью команды Resharper «debug unit-tests», все тесты проходят. Не имеет значения, запускаю ли я тесты индивидуально или пакетно. Исключение всегда происходит около вызовов запросов nhibernate, но я не могу сказать наверняка, поскольку трассировка стека сборки выпуска несколько разрежена. Это не зависит от генератора байт-кода nhibernate, такое же исключение появляется для castle и linfu. Есть ли у кого-нибудь идеи, как это отладить?

Изменить: удаление Spring.NET не повлияло на эту проблему.

Изменить: когда я переключаю вывод отладки конфигурации выпуска на full вместо pdb only и снимаю флажок optimize code, исключение исчезает. Обе настройки необходимы, если я изменю только одну из них, ошибка останется. Однако другой набор тестов не сработает, если я изменю только один. Все библиотеки классов скомпилированы для любого процессора.


person Malte Clasen    schedule 14.07.2010    source источник
comment
Можете ли вы проверить, отличаются ли конфигурация выпуска и отладки проекта? Я видел несколько случаев, когда кто-то просто добавлял X в конфигурацию отладки ... оставляя конфигурацию выпуска устаревшей ..   -  person Gishu    schedule 08.01.2011
comment
@Gishu: Мне удалось отследить разницу в результатах отладки и оптимизировать настройки кода - никакие другие настройки, похоже, не влияют на эту проблему.   -  person Malte Clasen    schedule 08.01.2011
comment
Хм .. Здесь нет определенного направления. из нескольких беглых поисков кажется, что это связано со сторонними вызовами dll. bit.ly/g3iwnK Попробуйте получить stacktrace и разместить сообщение на правильном форуме MS - кажется, это нишевая область ( не совсем сильная сторона ТАК)   -  person Gishu    schedule 09.01.2011


Ответы (3)


Наверное, это глупый вопрос: вы уверены, что все сборки скомпилированы с одинаковой архитектурой (x86 / x64)? Некоторое время назад я сталкивался с этим.

person Community    schedule 07.01.2011
comment
Должен ли он работать, когда все сборки скомпилированы для Any CPU, или мне нужно явно указывать цель? - person Malte Clasen; 08.01.2011
comment
Любой CPU должен работать. Компилятор JIT будет компилировать вещи в правильную архитектуру при выполнении. - person ; 09.01.2011

У меня было нечто подобное, когда я выбрал «Профиль клиента NET Framework 4.0». Попробуйте изменить целевую платформу на «NET Framework 4.0»

person NickD    schedule 08.01.2011

Мое приложение также будет работать в режиме отладки, но выйдет из строя с тем же исключением в конфигурации выпуска. Причина в том, что у меня был метод с условным атрибутом «DEBUG», который возвращал значение ...

Конечно, в конфигурации релиза все методы с условным атрибутом «DEBUG» заменены на заглушки без возвращаемого значения. Таким образом, среда IDE может подумать, что ваши типы в порядке при анализе кода и не выдают никаких предупреждений, но скомпилированное приложение имеет несоответствия возвращаемых типов!

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

person andyhasit    schedule 22.02.2014