Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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.ShutDown
von 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
.