Condividi tramite


System.ExecutionEngineException si verifica durante la visualizzazione della finestra WPF

Questo articolo consente di risolvere il problema in cui il tentativo di creare un'istanza di un'altra finestra WPF genera un'eccezione non gestita dopo la chiusura di una finestra di Windows Presentation Foundation (WPF).

Versione originale del prodotto: Visual Studio Professional 2010
Numero KB originale: 2691806

Sintomo

È stato sviluppato un componente WPF microsoft .NET 3.5 e lo si ospita in un'applicazione client non basata su WPF, ad esempio un'applicazione Windows Form o un'applicazione nativa. L'applicazione client chiama nel componente WPF per creare un'istanza e visualizzare una finestra WPF personalizzata. La prima istanza di Windows viene visualizzata come previsto. Tuttavia, dopo aver chiuso la finestra e aver tentato di creare un'istanza di un'altra finestra WPF, viene generata un'eccezione non gestita.

Se si esegue l'applicazione nell'IDE di Visual Studio, si ricevono le eccezioni e lo stack di chiamate seguenti:

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)

Se si esegue l'applicazione in un debugger nativo, ad esempio Windbg, si riceve un'eccezione del punto di interruzione con lo stack di chiamate seguente.

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

Motivo

Il sintomo di arresto anomalo si verifica quando l'applicazione chiama il System.Windows.Application.LoadComponent metodo per caricare un file XAML, associato a una finestra WPF o a userControl. Infine, le chiamate in fase di esecuzione WPF in System.Windows.Application.GetResourceOrContentPart per caricare i pacchetti di risorse associati all'oggetto corrente System.Windows.Application .

Questo errore si verifica perché non è stato possibile recuperare i pacchetti di risorse associati all'oggetto corrente System.Windows.Application . Ciò si verifica in genere perché l'oggetto corrente System.Windows.Application è già stato arrestato, tramite una chiamata esplicita o implicita a Application.ShutDown.

Questo comportamento è predefinito.

Risoluzione

Quando si crea l'istanza dell'oggetto System.Windows.Application , impostarne la ShutDownMode proprietà su ShutDownMode.OnExplicitShutdown. In questo modo l'oggetto Application verrà arrestato solo in seguito alla chiamata Application.ShutDownesplicita di codice personalizzato.

Maggiori informazioni

Quando viene chiamato il Application.ShutDown metodo , il runtime WPF scarica i pacchetti di risorse associati a tale Application oggetto. In un secondo momento, se l'applicazione esegue un'operazione che richiede l'accesso alle risorse associate allo stesso Application oggetto, il System.Windows.Application.GetResourceOrContentPart metodo tenta di caricare tali pacchetti di risorse, ma non è in grado di perché sono stati scaricati in precedenza. Quando WPF rileva questo problema, viene considerato una condizione irreversibile e WPF chiama System.Environment.FailFastintenzionalmente , che genera un System.ExecutionEngineException e termina il processo.

Un'applicazione client può creare un'istanza di un System.Windows.Application tipo (o derivato) per AppDomain. Le risorse associate all'oggetto Application vengono scaricate quando viene chiamato il Application.ShutDown metodo . Il Application.ShutDown metodo può essere chiamato in modo esplicito dal codice personalizzato oppure può essere chiamato internamente dal runtime WPF in base al valore della Application.ShutDownMode proprietà . Per impostazione predefinita, la ShutDownMode proprietà dell'oggetto Application è impostata su ShutDownMode.OnLastWindowClose. In questo modo, il runtime WPF arresta automaticamente l'oggetto Application dopo la chiusura dell'ultima finestra WPF associata a tale Application oggetto. In uno scenario in cui un'applicazione client ha creato un'istanza di un oggetto WPF Application e ha visualizzato una finestra e l'ha chiusa, tale finestra viene considerata l'ultima finestra chiusa, quindi WPF chiamerà Application.ShutDownautomaticamente .