共用方式為


顯示 WPF 視窗時,會發生 System.ExecutionEngineException

本文可協助您解決在關閉一個 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