Устранение неполадок при запуске в приложениях со смешанным кодом - PullRequest
2 голосов
/ 10 января 2012

У нас есть приложение, которое является настольным приложением C / C ++ / MFC, с некоторыми сборками C ++ / CLI, которые позволяют нам получить доступ к некоторым функциям управляемого кода. Приложение вылетает при запуске в режиме релиза только с сообщением

Произошло необработанное исключение типа «System.TypeInitializationException» в неизвестном модуле. Дополнительная информация: инициализатор типа для '' вызвал исключение.

Как можно отладить этот сценарий и каковы проблемы при смешивании управляемого / неуправляемого кода? Какие особые шаги я должен предпринять, чтобы они хорошо играли?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2013

По моему мнению (основываясь на некоторых проблемах, которые у меня были) комментарий Мэтта Смита является наиболее полезным ответом; на самом деле, проверьте «Брошенный» для всех типов исключений. Довольно часто проблема заключается в сбое в конструкторе глобального объекта. Смотрите также ответ 5 на

http://www.codeproject.com/Questions/67419/The-type-initializer-for-threw-an-exception

, который говорит (среди прочего):

Нажмите «Отладка -> Исключения» и установите флажки «Все брошенные». это заставит отладчик останавливаться на всех исключениях первого шанса и поможет вам найти ошибку под ошибкой инициализатора типа, которая ты видишь. Если это связано с другой сборкой, как у меня, вы можно использовать инструмент просмотра журнала привязки сборки Microsoft, чтобы помочь определить проблема.

0 голосов
/ 18 октября 2012

Есть подозрения:

Отсутствуют неуправляемые библиотеки DLL.Вы можете использовать Depends (от Sysinternals) и начать профилирование, но я изо всех сил пытался получить хорошие результаты в смешанном режиме.

Создайте собственный минимальный комплект тестов, который имеет те же зависимости, и запустите его через «Зависит» - вы получите исчерпывающую информацию об отсутствующих DLL.

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

...