Это неприятная проблема, вызванная уровнем эмуляции wow64, который позволяет запускать 32-разрядный код в 64-разрядной версии Windows 7. Он проглатывает исключения в коде, который запускается в ответ на уведомление, генерируемое 64-оконный менеджер битов, как событие Load
.Не позволяя отладчику увидеть его и вмешаться. Эту проблему трудно решить, группы Windows и DevDiv в Microsoft указывают пальцем вперед и назад.DevDiv ничего не может с этим поделать, Windows думает, что это правильное и задокументированное поведение, как бы странно это ни звучало.
Это, безусловно, задокументировано , но никто не понимает последствий и не думает об этомразумное поведение.Особенно, когда оконная процедура скрыта от глаз, конечно, как в любом проекте, который использует классы-обертки, чтобы скрыть оконную сантехнику.Как и в любом приложении Winforms, WPF или MFC.Основная проблема заключается в том, что Microsoft не смогла выяснить, как передать исключения из 32-разрядного кода обратно в 64-разрядный код, который вызвал уведомление, обратно в 32-разрядный код, который пытается обработать или отладить исключение.
Этопроблема только с подключенным отладчиком, ваш код будет бомбить как обычно без такового.
Проект> Свойства> вкладка «Сборка»> Цель платформы = AnyCPU и снимите флажок Предпочитать 32-разрядный.Ваше приложение теперь будет работать как 64-битный процесс, исключая режим сбоя wow64.Некоторые последствия: он отключает Edit + Continue для версий VS до VS2013 и может не всегда быть возможным, если у вас есть зависимость от 32-битного кода.
Другие возможные обходные пути:
- Отладка> Исключения> установите флажок «Брошено» для исключений CLR, чтобы заставить отладчик останавливаться на строке кода, которая вызывает исключение.
- Записать try / catch в обработчике события
Load
и выполнить аварийный вызов в блоке catch. - Используйте
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException)
в методе Main()
, чтобы ловушка исключений в цикле сообщений не отключалась в режиме отладки.Однако это затрудняет отладку всех необработанных исключений, событие ThreadException
довольно бесполезно. - Подумайте, действительно ли ваш код принадлежит обработчику события
Load
.Это очень редко нужно, однако оно очень популярно в VB.NET и в лебединой песне, потому что это событие по умолчанию, и двойной щелчок тривиально добавляет обработчик события.Вам действительно нужно Load
только когда вы заинтересованы в фактическом размере окна после применения пользовательских настроек и автомасштабирования.Все остальное принадлежит конструктору. - Обновление до Windows 8 или более поздней версии, они решают эту проблему wow64.