System.ExecutionEngineException tritt auf, wenn das WPF-Fenster angezeigt wird
Dieser Artikel hilft Ihnen, das Problem zu beheben, bei dem der Versuch, ein anderes WPF-Fenster zu instanziieren, zu einer unbehandelten Ausnahme führt, nachdem ein Windows Presentation Foundation (WPF)-Fenster geschlossen wurde.
Ursprüngliche Produktversion: Visual Studio Professional 2010
Ursprüngliche KB-Nummer: 2691806
Problembeschreibung
Sie haben eine Microsoft .NET 3.5-WPF-Komponente entwickelt und in einer Nicht-WPF-basierten Clientanwendung gehostet, z. B. einer Windows Forms-Anwendung oder einer systemeigenen Anwendung. Die Clientanwendung ruft die WPF-Komponente auf, um ein benutzerdefiniertes WPF-Fenster zu instanziieren und anzuzeigen. Die erste Instanziierung des Windows wird erwartungsgemäß angezeigt. Nach dem Schließen des Fensters und dem Versuch, ein anderes WPF-Fenster zu instanziieren, wird jedoch eine ausnahmefehlerbehebung ausgelöst.
Wenn Sie die Anwendung in der Visual Studio IDE ausführen, erhalten Sie folgende Ausnahme und Aufrufliste:
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)
Wenn Sie die Anwendung unter einem systemeigenen Debugger ausführen, z. B. Windbg, erhalten Sie eine Haltepunktausnahme mit dem folgenden Aufrufstapel.
eax=00000001 ebx=00000000 ecx=00000001 edx=001becbc esi=79aedfd0 bc=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
Ursache
Das Absturzsymptom tritt auf, wenn die Anwendung die System.Windows.Application.LoadComponent Methode aufruft, um eine XAML-Datei zu laden, die einem WPF-Fenster oder UserControl zugeordnet ist. Schließlich rufen die WPF-Laufzeitaufrufe zum Laden von Ressourcenpaketen auf, System.Windows.Application.GetResourceOrContentPart die dem aktuellen Objekt zugeordnet System.Windows.Application sind.
Dieser Fehler tritt auf, weil die ressourcenpakete, die dem aktuellen Objekt zugeordnet System.Windows.Application sind, nicht abgerufen werden konnten. Dies geschieht in der Regel, weil das aktuelle System.Windows.Application Objekt bereits heruntergefahren wurde, entweder durch einen expliziten oder impliziten Aufruf an Application.ShutDown .
Es handelt sich hierbei um ein beabsichtigtes Verhalten.
Lösung
Legen Sie beim Erstellen der Instanz des System.Windows.Application Objekts seine Eigenschaft auf ShutDownMode ShutDownMode.OnExplicitShutdown . Dadurch kann das Objekt nur Application aufgrund eines expliziten Aufrufs von benutzerdefiniertem Code heruntergefahren Application.ShutDown werden.
Weitere Informationen
Wenn die Application.ShutDown Methode aufgerufen wird, entladen die WPF-Laufzeit die Ressourcenpakete, die diesem Objekt zugeordnet Application sind. Wenn die Anwendung zu einem späteren Zeitpunkt eine Aktion ausführt, die den Zugriff auf die Ressourcen erfordert, die demselben Objekt zugeordnet Application sind, versucht die System.Windows.Application.GetResourceOrContentPart Methode, diese Ressourcenpakete zu laden, ist jedoch nicht in der Lage, da sie zuvor entladen wurden. Wenn WPF dies erkennt, wird dies als schwerwiegende Bedingung betrachtet, und WPF ruft absichtlich System.Environment.FailFast auf, was einen auslöst System.ExecutionEngineException und den Prozess beendet.
Eine Clientanwendung kann eine Instanz eines System.Windows.Application (oder abgeleiteten) Typs pro AppDomain erstellen. Die diesem Application-Objekt zugeordneten Ressourcen werden beim Aufrufen der Application.ShutDown Methode entladen. Die Application.ShutDown Methode kann explizit durch benutzerdefinierten Code oder intern von der WPF-Laufzeit aufgerufen werden, basierend auf dem Wert der Application.ShutDownMode Eigenschaft. Standardmäßig ist die ShutDownMode Eigenschaft des Objekts auf Application . ShutDownMode.OnLastWindowClose Dadurch wird die WPF-Laufzeit automatisch heruntergefahren, Application nachdem das letzte diesem Objekt zugeordnete WPF-Fenster geschlossen Application wurde. In einem Szenario, in dem eine Clientanwendung eine Instanz eines WPF-Objekts erstellt Application und ein Fenster angezeigt und geschlossen hat, gilt dieses Fenster als das letzte geschlossene Fenster, sodass WPF automatisch aufruft. Application.ShutDown