System.ExecutionEngineException se produce al mostrar la ventana WPF
Este artículo le ayuda a resolver el problema en el que al intentar crear una instancia de otra ventana WPF, se produce una excepción no controlada después de cerrar una ventana Windows Presentation Foundation (WPF).
Versión del producto original: Visual Studio Professional 2010
Número KB original: 2691806
Síntoma
Ha desarrollado un componente WPF de Microsoft .NET 3.5 y lo hospeda en una aplicación cliente no basada en WPF, como una aplicación Windows Forms o una aplicación nativa. La aplicación cliente llama al componente WPF para crear instancias y mostrar una ventana WPF personalizada. La primera instancia de la Windows se muestra según lo esperado. Sin embargo, después de cerrar la ventana e intentar crear una instancia de otra ventana WPF, se produce una excepción no controlada.
Si ejecuta la aplicación en el IDE Visual Studio, recibirá la siguiente excepción y pila de llamadas:
System.ExecutionEngineException: Exception of type 'System.ExecutionEngineException' was thrown.
WindowsBase.dll!MS.Internal.Invariant.FailFast(string message, string detailMessage)
WindowsBase.dll!MS.Internal.Invariant.Assert(bool condition, string invariantMessage)
PresentationFramework.dll!System.Windows.Application.GetResourceOrContentPart(System.Uri uri)
PresentationFramework.dll!System.Windows.Application.LoadComponent(object component, System.Uri resourceLocator)
WPFClassLibrary.dll!WPFClassLibrary.WPFWindow.InitializeComponent()
WPFClassLibrary.dll!WPFClassLibrary.WPFWindow.WPFWindow()
WPFClassLibrary.dll!WPFClassLibrary.WPFManager.ShowWpfWindow()
WindowsFormsApplication1.exe!WindowsFormsApplication1.Form1.button1_Click(object sender, System.EventArgs e)
Si ejecuta la aplicación en un depurador nativo, como Windbg, recibirá una excepción de punto de interrupción con la siguiente pila de llamadas.
eax=00000001 ebx=0000000 ecx=00000001 edx=001becbc esi=79aedfd0 edi=577ac529
eip=76c3280c esp=001be81c ebp=001becc8 iopl=0 nv up ei pl nz na po nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000202
KERNELBASE! DebugBreak+0x2: 76c3280c cc int 3
0:000> knL
# ChildEBP RetAddr
00 001be818 797cd3a7 KERNELBASE!DebugBreak+0x2
01 001becc8 797cd6e0 mscorwks!EEPolicy::LogFatalError+0x2b5
02 001bece0 797d58f4 mscorwks!EEPolicy::HandleFatalError+0x4d
03 001bed94 577ac529 mscorwks!SystemNative::FailFast+0x142
04 001bed9c 57877ec1 WindowsBase_ni!MS.Internal.Invariant.FailFast(System.String, System.String)+0x35
05 001bedbc 55b5ea77 WindowsBase_ni!MS.Internal.Invariant.Assert(Boolean, System.String)+0x219ca1
06 001bedbc 55b5d935 PresentationFramework_ni!System.Windows.Application.GetResourceOrContentPart(System.Uri)+0x87
07 001bede4 003e0589 PresentationFramework_ni!System.Windows.Application.LoadComponent(System.Object, System.Uri)+0xc5
08 001bedfc 003e04f8 WPFClassLibrary!WPFClassLibrary.WPFWindow.InitializeComponent()+0x79
09 001bee08 003e046e WPFClassLibrary!WPFClassLibrary.WPFWindow..ctor()+0x28
0a 001bee24 003e03dc WPFClassLibrary!WPFClassLibrary.WPFManager.ShowWpfWindow()+0x76
0b 001bee34 7aec4170 WindowsFormsApplication1!WindowsFormsApplication1.Form1.button1_Click(System.Object, System.EventArgs)+0x2c
Causa
El síntoma de bloqueo se produce cuando la aplicación llama al método para cargar un archivo System.Windows.Application.LoadComponent XAML, asociado con una ventana WPF o UserControl. Finalmente, el tiempo de ejecución wpf llama a para System.Windows.Application.GetResourceOrContentPart cargar paquetes de recursos asociados con el objeto System.Windows.Application actual.
Este error se produce porque no se pudieron recuperar los paquetes de recursos asociados con el objeto System.Windows.Application actual. Esto suele ocurrir porque el objeto actual ya se ha apagado, ya sea mediante una llamada System.Windows.Application explícita o implícita a Application.ShutDown .
Este comportamiento es una característica del diseño de la aplicación.
Resolución
Al crear la instancia del System.Windows.Application objeto, establezca su ShutDownMode propiedad en ShutDownMode.OnExplicitShutdown . Esto solo permitirá que el objeto se cierre como resultado de una llamada explícita Application de código personalizado Application.ShutDown .
Más información
Cuando se llama al método, wpf en tiempo de Application.ShutDown ejecución descarga los paquetes de recursos asociados con ese Application objeto. En algún momento posterior, si la aplicación hace algo que requiere tener acceso a los recursos asociados con el mismo objeto, el método intenta cargar esos paquetes de recursos, pero no puede porque se descargaron Application System.Windows.Application.GetResourceOrContentPart anteriormente. Cuando WPF detecta esto, se considera una condición fatal y WPF llama a propósito , que inicia System.Environment.FailFast un y termina el System.ExecutionEngineException proceso.
Una aplicación cliente puede crear una instancia de un System.Windows.Application tipo (o derivado) por AppDomain. Los recursos asociados con ese objeto Application se descargan cuando se Application.ShutDown llama al método. El código personalizado puede llamar explícitamente al método o el tiempo de ejecución wpf puede llamarlo internamente en función Application.ShutDown del valor de la Application.ShutDownMode propiedad. De forma predeterminada, ShutDownMode la propiedad del objeto se establece en Application ShutDownMode.OnLastWindowClose . Esto hará que el tiempo de ejecución wpf cierre el objeto automáticamente después de cerrar la última ventana wpf asociada Application Application con ese objeto. En un escenario en el que una aplicación cliente ha creado una instancia de un objeto WPF y ha mostrado un objeto Window y lo ha cerrado, se considera que esa ventana es la última ventana cerrada, por lo que WPF llamará automáticamente Application Application.ShutDown a .