Проблема Нарушения прав доступа за необработанными управляемыми Исключениями в управляемом С++ приложение.NET

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

Также, возможно, другие могли бы предложить причины?

Так или иначе я работаю над "смешанным режимом" приложение.NET, записанное в управляемом С++, но с тяжелыми ссылками в существующие собственные библиотеки.

Проблема была, необработанные управляемые исключения закончились как Нарушения прав доступа Win32. Под чем я подразумеваю, это - то, что вместо того, чтобы показать хорошее диалоговое окно.NET каждый добирается за необработанным управляемым исключением, вместо этого я добрался бы, более старый стиль "Необработанное win32 исключение произошел в..." сообщении.

Вот интересная вещь: если я запускаю приложение в отладчике, то выданное организованное исключение правильно взято. т.е. отладчик показывает мне строку.

Однако при выполнении обычно, это превратилось бы в это Нарушение прав доступа. Присоединение отладчика в той точке произвело бы мало полезной информации (это даже не покажет разумное отслеживание стека).

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

Так так или иначе мне удалось решить проблему путем сравнения моего проекта с чистым новым C++ управляемый проект, сгенерированный Visual Studio 2008.

Фиксация должна была сделать следующее:

  1. Измените флаг SUBSYSTEM / (Свойства проекта-> Компоновщик-> Система-> SubSystem) от/SUBSYSTEM:WINDOWS до "Не Набор"

  2. Переключенный с использования старого стиля WinMain () к использованию основного нового стиля ().

т.е. это раньше было

  int APIENTRY _tWinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPTSTR    lpCmdLine,
                       int       nCmdShow)

И это теперь

int main(array<System::String ^> ^args)

[Почему я использую этот странный _tWinMain? Это было тем, что было сгенерировано Visual Studio.NET IDE много лет назад, когда Вы создаете смешанное Приложение Windows режима образца. Это всегда хорошо работало (до сих пор), таким образом, я никогда не потрудился изменять его. _tWinMain является просто макросом к WinMain]

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

Я также внес обратное изменение в чистое демонстрационное приложение C++ и доказал, что это была причина.

Так, действительно мои вопросы, какого черта продолжается?

Это было просто, что я использовал старый стиль WinMain вместо нового main(array <String^>^)?

Я должен, возможно, сообщить об этом Microsoft (кто-либо будет заботиться ;-))?

15
задан Cœur 9 April 2018 в 04:42
поделиться