Вопрос System.ExecutionEngineException при загрузке окна WPF из Windows Form

Я обнаружил довольно странное поведение ...

Вот как воспроизвести проблему:

  1. Создайте проект приложения WPF.
  2. Удалите StartupUri из файла App.xaml.
  3. Добавьте в приложение обработчик событий запуска с подписью «private void Application_Startup(object sender, StartupEventArgs e)»
  4. Теперь добавьте форму в проект (щелкните правой кнопкой мыши и выберите «Добавить новый элемент»).
  5. в методе Application_Startup создайте объект формы и покажите его как Form1 f1 = new Form1(); f1.ShowDialog();
  6. На фактическом Form1 добавьте кнопку в конструктор и добавьте обработчик события щелчка к кнопке.
  7. Добавьте в проект новое окно WPF Window1.
  8. В обработчике событий нажатия кнопки Form1, созданном на шаге 6, добавьте строки кода для создания отображения окна WPF: Window1 w1 = new Window1(); w1.Show();
  9. Запустите проект и нажмите кнопку на winform, чтобы отобразить окно WPF ... пока работает нормально.
    1. Закройте окно WPF и снова нажмите кнопку winform. На этот раз вы должны получить исключение.

Итак, по сути, я создаю приложение WPF, которое отображает winform. Затем winform отображает окно WPF.

При первом отображении окна WPF все работает нормально. Если он закрыт, а затем снова открыт, я получаю исключение! Я также могу открыть несколько окон WPF, нажав кнопку несколько раз. Однако, как только последний будет закрыт, я больше никогда не смогу открыть другой без исключения ...

Я также пробовал различные советы, предложенные на http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/442782b1-00a1-4e2e-9cc6-ae99b6699126/, но они не помогают.

Почему это происходит?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
0
2 553
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поведение при выключении приложений Wpf по умолчанию (указанное на вкладке «Приложение» в свойствах проекта в VS или с помощью атрибута ShutdownMode в Application.Xaml) - «При закрытии последнего окна». Это означает, что когда вы закрываете созданное вами окно Wpf, Wpf завершает работу инфраструктуры приложения, поэтому любое последующее создание окна вызовет исключение.

Вы можете избежать этой проблемы, установив для режима выключения значение «При явном выключении» («OnExplicitShutdown» в Xaml). Затем вам нужно будет вручную вызвать Application.Current.Shutdown явно, когда вы хотите, чтобы приложение завершало работу (например, когда форма winforms закрыта).

+1. Если вы завершаете процесс (например, winform), вам все равно нужно вызывать Application.Current.Shutdown ()? Если да, что произойдет, если вы этого не сделаете?

Mike Fuchs 11.10.2012 15:42

Вы показали xaml, поскольку я добавил WPF Windows в свое приложение WinForms, у меня нет app.xaml, поэтому в Program.cs я добавил его, когда создал новый экземпляр System.Windows.Application. System.Windows.Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;

Robert Snyder 21.09.2013 22:52

Другие вопросы по теме