Как выполнять обработку исключений в смешанных приложениях? (управляемое приложение, использующее неуправляемую DLL)

Можно ли генерировать исключения в неуправляемой DLL и обрабатывать их в управляемом приложении?

Моя неуправляемая C ++ DLL выдает исключения в случае ошибок, и они должны быть обработаны в вызывающем исполняемом приложении.

CMyFileException *x = new CMyFileException;
throw(x);

Раньше это работало, но теперь приложение скомпилировано с разными флагами (/ clr и т. Д.), Потому что нам нужно использовать некоторый управляемый код. Когда генерируется исключение, я получаю System.ExecutionEngineException, который, похоже, не перехватывается даже с помощью catch (...) в моем вызывающем exe.

Я видел, что параметр компилятора / clr подразумевает / EHa для обработки исключений, но, насколько я понимаю, это, похоже, вариант для выбора.

Будет ли какая-либо другая альтернатива (настройка компилятора / компоновщика) для генерирования и перехвата исключений через границы модуля (DLL / exe)?

Спасибо за поддержку! Марко


person marco4net    schedule 08.01.2010    source источник


Ответы (2)


Происходит что-то еще. Среда CLR выдает исключение ExecutionEngineException, когда обнаруживает, что куча со сборкой мусора повреждена. Это несложно сделать, когда вы запускаете неуправляемый код в управляемой программе. Достаточно простого переполнения буфера. Однако найти ошибку непросто.

person Hans Passant    schedule 11.01.2010
comment
Наконец нашел это - операция указателя, назначающая цвет растрового изображения со сдвигом битов - образец кода MSDN из 92 и 16-битной эры. вздох Вызвал проблему, которая вообще не приводила к сбою приложения, но намного позже постоянно создавала проблему при генерировании исключений (даже throw; без аргументов) Спасибо за вашу поддержку! - person marco4net; 12.01.2010

можно вызвать исключение в неуправляемом коде, но в конечном итоге исключение будет перехвачено clr и обернуто как исключения SEH.

вы можете прочитать этот вопрос:

Лучшая практика для перевода исключений в класс-оболочку C ++ / CLI < / а>

person Benny    schedule 11.01.2010
comment
мерси за ссылку! интересно читать, после исправления работы указателя я получил правильное исключение. - person marco4net; 12.01.2010