Страницы

Поиск по вопросам

понедельник, 16 декабря 2019 г.

Странное поведение исключений в Form_Load

#c_sharp #net #winforms #vbnet #отладка


Если в обработчике события Load происходит исключение, то при запуске из VS оно не
отображается - просто прерывается выполнение метода и отображается форма. Это происходит
как при запуске, так и при пошаговой отладке.

В предыдущих версиях VS эту проблему решало создание новой конфигурации билда под
x64. Хотя, приходилось выставлять Empty в качестве базовой, что само по себе неудобно,
т. к. приходится заново настраивать уровни предупреждений.

Но в VS2015 что-то ничего хорошего не получается. Что делать?

Скринвидео проблемы (27MB).

PS: Нашёл несколько таких вопросов на enSO, но там либо жуткие костыли, либо описание
того, что это связано с 32-битностью приложения.
    


Ответы

Ответ 1



1. Первый вариант из англоязычного SO. Кратенько копирую: Добавляем класс для вызова потребных функций: public static class Kernel32 { public const uint PROCESS_CALLBACK_FILTER_ENABLED = 0x1; [DllImport("Kernel32.dll")] public static extern bool SetProcessUserModeExceptionPolicy(UInt32 dwFlags); [DllImport("Kernel32.dll")] public static extern bool GetProcessUserModeExceptionPolicy(out UInt32 lpFlags); public static void DisableUMCallbackFilter() { uint flags; GetProcessUserModeExceptionPolicy(out flags); flags &= ~PROCESS_CALLBACK_FILTER_ENABLED; SetProcessUserModeExceptionPolicy(flags); } } Вызываем это всё на старте приложения: [STAThread] static void Main() { if (System.Diagnostics.Debugger.IsAttached) { Kernel32.DisableUMCallbackFilter(); } Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } 2. Второй вариант - разорвать негодный контекст вызова Form_Load: private void Form1_Load(object sender, EventArgs e) { if (System.Diagnostics.Debugger.IsAttached) { //Форме рано представать перед пользователем. this.WindowState = FormWindowState.Minimized; this.ShowInTaskbar = false; Task.Run( delegate { //Это нужно, чтобы успеть посмотреть, как процесс //загрузки будет выглядеть для пользователя. //Thread.Sleep(3000); this.Invoke( new Action(delegate { FormLoadLogic(); //Теперь можно форму показать. this.WindowState = FormWindowState.Normal; this.ShowInTaskbar = true; })); }); } else { FormLoadLogic(); } } FormLoadLogic() { this.Text = "step 1"; throw new Exception("test"); this.Text = "step 2"; }

Комментариев нет:

Отправить комментарий