本文可協助您解決在關閉一個 Windows Presentation Foundation (WPF) 視窗之後,嘗試具現化另一個 WPF 視窗會導致未處理的例外狀況的問題。
原始產品版本: Visual Studio Professional 2010
原始 KB 編號: 2691806
癥狀
您已開發Microsoft .NET 3.5 WPF 元件,並將其裝載在非 WPF 型用戶端應用程式中,例如 Windows Forms 應用程式或原生應用程式。 用戶端應用程式會呼叫 WPF 元件,以具現化和顯示自定義 WPF 視窗。 Windows 的第一個具現化會顯示為預期。 不過,關閉 Window 並嘗試具現化另一個 WPF 視窗之後,會產生未處理的例外狀況。
如果在 Visual Studio IDE 中執行應用程式,您會收到下列例外狀況並呼叫堆棧:
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)
如果在原生調試程式下執行應用程式,例如Windbg,您會收到具有下列呼叫堆疊的斷點例外狀況。
eax=00000001 ebx=00000000 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
原因
當應用程式呼叫 System.Windows.Application.LoadComponent
方法以載入與 WPF 視窗或 UserControl 相關聯的 XAML 檔案時,就會發生當機徵兆。 最後,WPF 運行時間會呼叫 , System.Windows.Application.GetResourceOrContentPart
以載入與目前 System.Windows.Application
對象相關聯的資源套件。
發生此失敗的原因是無法擷取與目前 System.Windows.Application
對象相關聯的資源套件。 這通常是因為目前的 System.Windows.Application
對象已經由明確或隱含呼叫 Application.ShutDown
關閉。
這行為是經過設計的。
解決辦法
建立物件的實體 System.Windows.Application
時,將其 ShutDownMode
屬性設定為 ShutDownMode.OnExplicitShutdown
。 這隻會允許 Application
因為明確呼叫 Application.ShutDown
的自訂程式代碼而關閉 物件。
詳細資訊
Application.ShutDown
呼叫 方法時,WPF 運行時間會卸除與該Application
對象相關聯的資源套件。 稍後,如果應用程式執行需要存取與相同 Application
對象相關聯之資源的內容,此方法 System.Windows.Application.GetResourceOrContentPart
會嘗試載入這些資源套件,但無法因為先前卸除這些資源套件。 當 WPF 偵測到此情況時,它會被視為嚴重狀況,且 WPF 會故意呼叫 System.Environment.FailFast
,這會擲回 System.ExecutionEngineException
並終止進程。
允許用戶端應用程式為每個AppDomain建立一個 (或衍生) 類型的實例 System.Windows.Application
。 呼叫 方法時 Application.ShutDown
,會卸除與該 Application 對象相關聯的資源。
Application.ShutDown
方法可由自定義程式代碼明確呼叫,或者根據 屬性的值Application.ShutDownMode
,WPF 運行時間可以在內部呼叫此方法。 根據預設, ShutDownMode
物件的屬性 Application
會設定為 ShutDownMode.OnLastWindowClose
。 這會導致 WPF 運行時間在與該Application
物件相關聯的最後一個 WPF 視窗關閉之後自動關閉Application
物件。 在用戶端應用程式已建立 WPF Application
物件的實例並顯示 Window 並關閉它的情況下,該視窗被視為最後一個視窗關閉,因此 WPF 會自動呼叫 Application.ShutDown
。