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