Question System.ExecutionEngineException while loading WPF window from Windows Form
I found some rather strange behavior...
Here is how to replicate the problem:
- Create a WPF Application Project.
- Remove the StartupUri from the App.xaml file.
- Add a Startup Event Handler to the App with signature "private void Application_Startup(object sender, StartupEventArgs e)"
- Now, add a Form to the project (right click and select add new item).
- in the Application_Startup method, create the form object and show it like Form1 f1 = new Form1(); f1.ShowDialog();
- On the actual Form1, add a button to the designer, and add a click event handler to the button.
- Add a new WPF window to your project, Window1.
- In the Form1's button click event handler created in step 6, add the lines of code to create display the WPF window: Window1 w1 = new Window1(); w1.Show();
- Run the project and click the button on the winform to show the WPF window... works fine so far.
- Close the WPF window and click the winform's button again. This time you should get the exception.
So, essentially what I do is create a WPF application that displays a winform. Then, the winform displays a WPF Window.
The first time the WPF window is displayed, everything works fine. If it is closed, and then re-opened, I get the exception! I can also open up multiple WPF windows by clicking the button multiple times. Once the last one is closed, however, I can never open another one again without the exception...
I have also tried the various tips suggested at http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/442782b1-00a1-4e2e-9cc6-ae99b6699126/ but those don't help.
Why is this happening?
The default Wpf applicationshutdown behavior (specified on the "Application" tab in project properties in VS or using the ShutdownMode attribute in Application.Xaml) is "On Last Window Close". This means that when you close the Wpf window you create, Wpf shuts down the application framework so any subsequent window creations will throw an exception.
You can avoid this problem by setting the Shutdown mode to "On explicit shutdown" ("OnExplicitShutdown" in Xaml). You will then need to manually call Application.Current.Shutdown explicitly when you want the app to terminate (e.g. when the winforms form is closed).