Freigeben über


System.ExecutionEngineException tritt beim Anzeigen des WPF-Fensters auf

Dieser Artikel hilft Ihnen, das Problem zu beheben, bei dem der Versuch, ein anderes WPF-Fenster zu instanziieren, eine unbehandelte Ausnahme nach dem Schließen eines WPF-Fensters (Windows Presentation Foundation) führt.

Originalproduktversion: Visual Studio Professional 2010
Ursprüngliche KB-Nummer: 2691806

Symptom

Sie haben eine Microsoft .NET 3.5-WPF-Komponente entwickelt und in einer nicht WPF-basierten Clientanwendung gehostet, z. B. eine Windows Forms-Anwendung oder systemeigene Anwendung. Die Clientanwendung ruft die WPF-Komponente auf, um ein benutzerdefiniertes WPF-Fenster zu instanziieren und anzuzeigen. Die erste Instanziierung von Windows wird erwartungsgemäß angezeigt. Nach dem Schließen des Fensters und dem Versuch, ein weiteres WPF-Fenster zu instanziieren, wird jedoch eine ausnahmelos ausgelöst.

Wenn Sie die Anwendung in der Visual Studio-IDE ausführen, erhalten Sie folgende Ausnahme und einen Aufrufstapel:

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 Haltepunkt-Ausnahme mit dem folgenden Aufrufstapel.

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

Ursache

Das Absturzsymptom tritt auf, wenn die Anwendung die Methode aufruft System.Windows.Application.LoadComponent , um eine XAML-Datei zu laden, die einem WPF-Fenster oder UserControl zugeordnet ist. Schließlich werden von den WPF-Laufzeitaufrufen System.Windows.Application.GetResourceOrContentPart Ressourcenpakete geladen, die dem aktuellen System.Windows.Application Objekt zugeordnet sind.

Dieser Fehler tritt auf, da die ressourcenpakete, die dem aktuellen System.Windows.Application Objekt zugeordnet sind, nicht abgerufen werden konnten. Dies tritt in der Regel auf, da das aktuelle System.Windows.Application Objekt bereits heruntergefahren wurde, entweder durch einen expliziten oder impliziten Aufruf von Application.ShutDown.

Dieses Verhalten ist beabsichtigt.

Beschluss

Wenn Sie die Instanz des System.Windows.Application Objekts erstellen, legen Sie dessen ShutDownMode Eigenschaft auf ShutDownMode.OnExplicitShutdown. Dadurch kann das Application Objekt nur aufgrund eines expliziten Aufrufs Application.ShutDownvon benutzerdefiniertem Code heruntergefahren werden.

Mehr Informationen

Wenn die Application.ShutDown Methode aufgerufen wird, entlädt die WPF-Laufzeit die ressourcenpakete, Application die diesem Objekt zugeordnet sind. Wenn die Anwendung zu einem späteren Zeitpunkt etwas ausführt, das den Zugriff auf die ressourcen erfordert, die demselben Application Objekt zugeordnet sind, versucht die System.Windows.Application.GetResourceOrContentPart Methode, diese Ressourcenpakete zu laden, ist aber nicht in der Lage, weil sie zuvor entladen wurden. Wenn WPF dies erkennt, gilt es als schwerwiegende Bedingung und WPF ruft absichtlich auf System.Environment.FailFast, wodurch ein System.ExecutionEngineException Prozess ausgelöst und beendet wird.

Eine Clientanwendung darf eine Instanz eines System.Windows.Application (oder abgeleiteten) Typs pro AppDomain erstellen. Die ressourcen, die diesem Application-Objekt zugeordnet sind, werden beim Aufrufen der Application.ShutDown Methode entladen. Die Application.ShutDown Methode kann explizit durch benutzerdefinierten Code aufgerufen werden, oder sie kann intern von der WPF-Laufzeit basierend auf dem Wert der Application.ShutDownMode Eigenschaft aufgerufen werden. Standardmäßig ist die ShutDownMode Eigenschaft des Application Objekts auf ShutDownMode.OnLastWindowClose. Dies führt dazu, dass die WPF-Laufzeit das Application Objekt automatisch herunterfahren kann, nachdem das letzte dem Objekt zugeordnete Application WPF-Fenster geschlossen wurde. In einem Szenario, in dem eine Clientanwendung eine Instanz eines WPF-Objekts Application erstellt und ein Fenster angezeigt und geschlossen hat, gilt dieses Fenster als das letzte geschlossene Fenster, sodass WPF automatisch aufruft Application.ShutDown.