Share via


System.ExecutionEngineException vindt plaats bij het weergeven van HET WPF-venster

Dit artikel helpt u bij het oplossen van het probleem waarbij een andere WPF-venster wordt geïnstitueerd in een niet-verwerkte uitzondering na het sluiten van een WPF-venster (Windows Presentation Foundation).

Oorspronkelijke productversie: Visual Studio Professional 2010
Oorspronkelijk KB-nummer: 2691806

Symptoom

U hebt een Microsoft .NET 3.5 WPF-onderdeel ontwikkeld en gehost in een niet-WPF-clienttoepassing, zoals een Windows Forms-toepassing of systeemeigen toepassing. De clienttoepassing roept het WPF-onderdeel aan om een aangepast WPF-venster te instantiëren en weer te geven. De eerste instantie van windows wordt weergegeven zoals verwacht. Na het sluiten van het venster en het instantiëren van een ander WPF-venster resulteert echter in een niet-verwerkte uitzondering.

Als u de toepassing uitvoert in de Visual Studio IDE, ontvangt u de volgende uitzondering en aanroepstack:

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)

Als u de toepassing uitvoert onder een systeemeigen foutopsporingsprogramma, zoals Windbg, ontvangt u een onderbrekingspuntuitzondering met de volgende aanroepstack.

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

Oorzaak

Het crashsymptoom treedt op wanneer de toepassing de methode aanroept System.Windows.Application.LoadComponent om een XAML-bestand te laden dat is gekoppeld aan een WPF-venster of UserControl. Uiteindelijk roept de WPF-runtime System.Windows.Application.GetResourceOrContentPart aan om resourcepakketten te laden die zijn gekoppeld aan het huidige System.Windows.Application object.

Deze fout treedt op omdat de resourcepakketten die zijn gekoppeld aan het huidige System.Windows.Application object niet kunnen worden opgehaald. Dit gebeurt meestal omdat het huidige System.Windows.Application object al is afgesloten, hetzij door een expliciete of impliciete aanroep naar Application.ShutDown.

Dit gedrag is opzettelijk ontworpen.

Resolutie / Besluit

Wanneer u het exemplaar van het System.Windows.Application object maakt, stelt u de eigenschap ervan ShutDownMode in op ShutDownMode.OnExplicitShutdown. Hierdoor kan het Application object alleen worden afgesloten als gevolg van aangepaste code die expliciet wordt aangeroepen Application.ShutDown.

Meer informatie

Wanneer de Application.ShutDown methode wordt aangeroepen, verwijdert de WPF-runtime de resourcepakketten die aan dat Application object zijn gekoppeld. Als de toepassing later iets doet waarvoor toegang nodig is tot de resources die aan hetzelfde Application object zijn gekoppeld, probeert de System.Windows.Application.GetResourceOrContentPart methode deze resourcepakketten te laden, maar niet omdat ze eerder zijn verwijderd. Wanneer WPF dit detecteert, wordt het beschouwd als een fatale toestand en WPF doeldoelloos aanroepen System.Environment.FailFast, waardoor het System.ExecutionEngineException proces wordt veroorzaakt en beëindigd.

Een clienttoepassing mag één exemplaar van een System.Windows.Application (of afgeleid) type per AppDomain maken. De resources die aan dat toepassingsobject zijn gekoppeld, worden verwijderd wanneer de Application.ShutDown methode wordt aangeroepen. De Application.ShutDown methode kan expliciet worden aangeroepen met aangepaste code of intern worden aangeroepen door de WPF-runtime op basis van de waarde van de Application.ShutDownMode eigenschap. De eigenschap van het ShutDownMode object is standaard Application ingesteld op ShutDownMode.OnLastWindowClose. Dit zorgt ervoor dat de WPF-runtime het Application object automatisch afsluit nadat het laatste WPF-venster dat aan dat Application object is gekoppeld, is gesloten. In een scenario waarin een clienttoepassing een exemplaar van een WPF-object Application heeft gemaakt en een venster heeft weergegeven en gesloten, wordt dat venster geacht het laatste venster te zijn gesloten, zodat WPF automatisch wordt aangeroepen Application.ShutDown.