Delen via


Ngen.exe (Native Image Generator)

De Native Image Generator (Ngen.exe) is een hulpprogramma waarmee de prestaties van beheerde toepassingen worden verbeterd. Ngen.exe systeemeigen installatiekopieën maakt, die bestanden zijn die gecompileerde processorspecifieke computercode bevatten en worden geïnstalleerd in de systeemeigen installatiekopiecache op de lokale computer. De runtime kan systeemeigen installatiekopieën uit de cache gebruiken in plaats van de Just-In-Time-compiler (JIT) te gebruiken om de oorspronkelijke assembly te compileren.

Notitie

Ngen.exe compileert systeemeigen installatiekopieën voor assembly's die alleen gericht zijn op .NET Framework. De equivalente systeemeigen installatiekopiegenerator voor .NET Core is CrossGen.

Wijzigingen in Ngen.exe in .NET Framework 4:

  • Ngen.exe compileert nu assembly's met volledig vertrouwen en cas-beleid (Code Access Security) wordt niet meer geëvalueerd.

  • Systeemeigen installatiekopieën die worden gegenereerd met Ngen.exe kunnen niet meer worden geladen in toepassingen die gedeeltelijk worden vertrouwd.

Wijzigingen in Ngen.exe in .NET Framework versie 2.0:

  • Als u een assembly installeert, worden ook de afhankelijkheden geïnstalleerd, waardoor de syntaxis van Ngen.exe wordt vereenvoudigd.

  • Systeemeigen installatiekopieën kunnen nu worden gedeeld tussen toepassingsdomeinen.

  • Met een nieuwe actie updateworden installatiekopieën die ongeldig zijn gemaakt, opnieuw gemaakt.

  • Acties kunnen worden uitgesteld voor uitvoering door een service die gebruikmaakt van niet-actieve tijd op de computer om installatiekopieën te genereren en te installeren.

  • Sommige oorzaken van ongeldige installatiekopieën zijn geëlimineerd.

Zie Systeemeigen installatiekopieën in Windows 8.

Zie Native Image Service voor meer informatie over het gebruik van Ngen.exe en de systeemeigen installatiekopieënservice.

Notitie

Ngen.exe syntaxis voor versies 1.0 en 1.1 van .NET Framework vindt u in de verouderde syntaxis van native image generator (Ngen.exe).

Dit hulpprogramma wordt automatisch geïnstalleerd met Visual Studio. Als u het hulpprogramma wilt uitvoeren, gebruikt u de Visual Studio Developer-opdrachtprompt of Visual Studio Developer PowerShell.

Typ het volgende bij de opdrachtprompt:

Syntaxis

ngen action [options]
ngen /? | /help

Acties

In de volgende tabel ziet u de syntaxis van elke action. Zie de tabellen Argumenten, Prioriteitsniveaus, Scenario's en Configuratietabellen voor beschrijvingen van de afzonderlijke onderdelen van een actiontabel. In de tabel Opties worden de options en de Help-schakelopties beschreven.

Actie Beschrijving
install[assemblyNameassemblyPath | ] [scenarios] [config] [/queue[{1|:|23}]] Genereer systeemeigen installatiekopieën voor een assembly en de bijbehorende afhankelijkheden en installeer de installatiekopieën in de systeemeigen installatiekopieëncache.

Als /queue dit is opgegeven, wordt de actie in de wachtrij geplaatst voor de systeemeigen installatiekopieënservice. De standaardprioriteit is 3. Zie de tabel Prioriteitsniveaus .
uninstall [assemblyName | assemblyPath] [scenarios] [] [config] Verwijder de systeemeigen installatiekopieën van een assembly en de bijbehorende afhankelijkheden uit de systeemeigen installatiekopieëncache.

Als u één installatiekopie en de bijbehorende afhankelijkheden wilt verwijderen, gebruikt u dezelfde opdrachtregelargumenten die zijn gebruikt om de installatiekopie te installeren. Opmerking: vanaf .NET Framework 4 wordt de actie uninstall * niet meer ondersteund.
update [/queue] Systeemeigen installatiekopieën bijwerken die ongeldig zijn geworden.

Als /queue dit is opgegeven, worden de updates in de wachtrij geplaatst voor de systeemeigen installatiekopieënservice. Updates worden altijd gepland op prioriteit 3, zodat ze worden uitgevoerd wanneer de computer niet actief is.
display [assemblyName | assemblyPath] De status van de systeemeigen installatiekopieën voor een assembly en de bijbehorende afhankelijkheden weergeven.

Als er geen argument wordt opgegeven, wordt alles in de systeemeigen afbeeldingscache weergegeven.
executeQueuedItems [1|2|3]

– of –

eqi [1|2|3]
Compilatietaken in de wachtrij uitvoeren.

Als een prioriteit is opgegeven, worden compilatietaken met een hogere of gelijke prioriteit uitgevoerd. Als er geen prioriteit is opgegeven, worden alle compilatietaken in de wachtrij uitgevoerd.
queue{pause | | continuestatus} Pauzeer de systeemeigen installatiekopieënservice, laat de onderbroken service doorgaan of voer een query uit op de status van de service.

Argumenten

Argument Beschrijving
assemblyName De volledige weergavenaam van de assembly. Bijvoorbeeld: "myAssembly, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0038abc9deabfle5". Opmerking: U kunt een gedeeltelijke assemblynaam opgeven, zoals myAssembly, voor de display en uninstall acties.

Er kan slechts één assembly worden opgegeven per Ngen.exe opdrachtregel.
assemblyPath Het expliciete pad van de assembly. U kunt een volledig of relatief pad opgeven.

Als u een bestandsnaam zonder pad opgeeft, moet de assembly zich in de huidige map bevinden.

Er kan slechts één assembly worden opgegeven per Ngen.exe opdrachtregel.

Prioriteitsniveaus

Prioriteit Beschrijving
1 Systeemeigen installatiekopieën worden onmiddellijk gegenereerd en geïnstalleerd, zonder te wachten op niet-actieve tijd.
2 Systeemeigen installatiekopieën worden gegenereerd en geïnstalleerd zonder te wachten op niet-actieve tijd, maar nadat alle acties met prioriteit 1 (en hun afhankelijkheden) zijn voltooid.
3 Systeemeigen installatiekopieën worden geïnstalleerd wanneer de systeemeigen installatiekopieënservice detecteert dat de computer niet actief is. Zie systeemeigen installatiekopieënservice.

Scenario's

Scenario Beschrijving
/Debug Systeemeigen installatiekopieën genereren die kunnen worden gebruikt onder een foutopsporingsprogramma.
/Profile Systeemeigen afbeeldingen genereren die kunnen worden gebruikt onder een profiler.
/NoDependencies Genereer het minimale aantal systeemeigen installatiekopieën dat is vereist voor de opgegeven scenarioopties.

Configureren

Configuratie Beschrijving
/ExeConfig: exePath Gebruik de configuratie van de opgegeven uitvoerbare assembly.

Ngen.exe moet dezelfde beslissingen nemen als het laadprogramma wanneer het aan afhankelijkheden is gebonden. Wanneer een gedeeld onderdeel tijdens runtime wordt geladen met behulp van de Load methode, bepaalt het configuratiebestand van de toepassing de afhankelijkheden die worden geladen voor het gedeelde onderdeel, bijvoorbeeld de versie van een afhankelijkheid die wordt geladen. De /ExeConfig switch biedt Ngen.exe richtlijnen voor welke afhankelijkheden tijdens de runtime worden geladen.
/AppBase: directoryPath Wanneer u afhankelijkheden opzoekt, gebruikt u de opgegeven map als de toepassingsbasis.

Opties

Optie Omschrijving
/nologo De weergave van de opstartbanner van Microsoft onderdrukken.
/silent De weergave van geslaagde berichten onderdrukken.
/verbose Gedetailleerde informatie weergeven voor foutopsporing.
/help, /? De syntaxis en opties van de opdracht weergeven voor de huidige release.

Opmerkingen

Als u Ngen.exe wilt uitvoeren, moet u beheerdersbevoegdheden hebben.

Let op

Voer Ngen.exe niet uit op assembly's die niet volledig worden vertrouwd. Vanaf .NET Framework 4 worden Ngen.exe assembly's gecompileerd met volledig vertrouwen en wordt het CAS-beleid (Code Access Security) niet meer geëvalueerd.

Vanaf .NET Framework 4 kunnen de systeemeigen installatiekopieën die worden gegenereerd met Ngen.exe niet meer worden geladen in toepassingen die gedeeltelijk worden vertrouwd. In plaats daarvan wordt de Just-In-Time-compiler (JIT) aangeroepen.

Ngen.exe systeemeigen installatiekopieën genereert voor de assembly die is opgegeven door het assemblyname argument voor de install actie en alle bijbehorende afhankelijkheden. Afhankelijkheden worden bepaald op basis van verwijzingen in het assemblymanifest. Het enige scenario waarin u een afhankelijkheid afzonderlijk moet installeren, is wanneer de toepassing deze laadt met weerspiegeling, bijvoorbeeld door de Assembly.Load methode aan te roepen.

Belangrijk

Gebruik de Assembly.LoadFrom methode niet met systeemeigen installatiekopieën. Een afbeelding die met deze methode is geladen, kan niet worden gebruikt door andere assembly's in de uitvoeringscontext.

Ngen.exe houdt een telling van afhankelijkheden bij. Stel dat MyAssembly.exe en YourAssembly.exe beide zijn geïnstalleerd in de systeemeigen installatiekopieëncache en beide verwijzingen hebben naar OurDependency.dll. Als MyAssembly.exe deze wordt verwijderd, OurDependency.dll wordt deze niet verwijderd. Deze wordt alleen verwijderd wanneer YourAssembly.exe deze ook wordt verwijderd.

Als u een systeemeigen installatiekopieën voor een assembly in de globale assemblycache genereert, geeft u de weergavenaam op. Zie Assembly.FullName.

De systeemeigen installatiekopieën die Ngen.exe genereert, kunnen worden gedeeld in toepassingsdomeinen. Dit betekent dat u Ngen.exe kunt gebruiken in toepassingsscenario's waarvoor assembly's moeten worden gedeeld tussen toepassingsdomeinen. Domeinneutraalheid opgeven:

Gebruik altijd domeinneutrale code bij het laden van dezelfde assembly in meerdere toepassingsdomeinen. Als een systeemeigen installatiekopieën worden geladen in een niet-gedeeld toepassingsdomein nadat deze in een gedeeld domein zijn geladen, kan deze niet worden gebruikt.

Notitie

Domeinneutrale code kan niet worden uitgepakt en de prestaties zijn mogelijk iets trager, met name bij het openen van statische leden.

In deze sectie Opmerkingen:

Installatiekopieën genereren voor verschillende scenario's

Nadat u een systeemeigen installatiekopieën voor een assembly hebt gegenereerd, probeert de runtime deze systeemeigen installatiekopieën automatisch te vinden en te gebruiken telkens wanneer de assembly wordt uitgevoerd. Er kunnen meerdere installatiekopieën worden gegenereerd, afhankelijk van gebruiksscenario's.

Als u bijvoorbeeld een assembly uitvoert in een foutopsporings- of profileringsscenario, zoekt de runtime naar een systeemeigen installatiekopieën die zijn gegenereerd met de /Debug of /Profile opties. Als er geen overeenkomende systeemeigen installatiekopieën kunnen worden gevonden, wordt de runtime teruggezet naar standaard-JIT-compilatie. De enige manier om fouten in systeemeigen installatiekopieën op te sporen, is door een systeemeigen installatiekopieën te maken met de /Debug optie.

De uninstall actie herkent ook scenario's, zodat u alle scenario's of alleen geselecteerde scenario's kunt verwijderen.

Bepalen wanneer systeemeigen installatiekopieën moeten worden gebruikt

Systeemeigen installatiekopieën kunnen prestatieverbeteringen bieden op twee gebieden: verbeterd geheugengebruik en verminderde opstarttijd.

Notitie

De prestaties van systeemeigen installatiekopieën zijn afhankelijk van een aantal factoren die analyse moeilijk maken, zoals code- en gegevenstoegangspatronen, hoeveel aanroepen er worden gedaan over de grenzen van de module en hoeveel afhankelijkheden al door andere toepassingen zijn geladen. De enige manier om te bepalen of systeemeigen installatiekopieën voordeel hebben van uw toepassing, is door zorgvuldige prestatiemetingen in uw belangrijkste implementatiescenario's.

Verbeterd geheugengebruik

Systeemeigen installatiekopieën kunnen het geheugengebruik aanzienlijk verbeteren wanneer code wordt gedeeld tussen processen. Systeemeigen installatiekopieën zijn Windows PE-bestanden, dus één kopie van een .dll-bestand kan worden gedeeld door meerdere processen; Systeemeigen code die door de JIT-compiler wordt geproduceerd, wordt daarentegen opgeslagen in privégeheugen en kan niet worden gedeeld.

Toepassingen die worden uitgevoerd onder terminalservices, kunnen ook profiteren van gedeelde codepagina's.

Bovendien bespaart het niet laden van de JIT-compiler een vaste hoeveelheid geheugen voor elk toepassingsexemplaren.

Sneller opstarten van toepassingen

Het vooraf compileren van assembly's met Ngen.exe kan de opstarttijd voor sommige toepassingen verbeteren. Over het algemeen kunnen er winst worden gemaakt wanneer toepassingen onderdelenassembly's delen, omdat nadat de eerste toepassing is gestart, de gedeelde onderdelen al zijn geladen voor volgende toepassingen. Koud opstarten, waarbij alle assembly's in een toepassing moeten worden geladen vanaf de harde schijf, profiteert niet zoveel van systeemeigen installatiekopieën omdat de toegangstijd van de harde schijf overheerst.

Harde binding kan van invloed zijn op de opstarttijd, omdat alle installatiekopieën die moeilijk zijn gebonden aan de hoofdtoepassingsassembly, tegelijkertijd moeten worden geladen.

Notitie

Voordat .NET Framework 3.5 Service Pack 1 wordt uitgevoerd, moet u gedeelde, sterk benoemde onderdelen in de globale assemblycache plaatsen, omdat het laadprogramma extra validatie uitvoert voor sterk benoemde assembly's die zich niet in de globale assemblycache bevinden, waardoor de opstarttijd die is opgedaan door systeemeigen installatiekopieën effectief te elimineren. Optimalisaties die zijn geïntroduceerd in .NET Framework 3.5 SP1 hebben de extra validatie verwijderd.

Overzicht van gebruiksoverwegingen

De volgende algemene overwegingen en toepassingsoverwegingen kunnen u helpen bij het bepalen of u de moeite neemt om systeemeigen installatiekopieën voor uw toepassing te evalueren:

  • Systeemeigen installatiekopieën worden sneller geladen dan CIL, omdat er geen opstartactiviteiten meer nodig zijn, zoals JIT-compilatie en verificatie van typeveiligheid.

  • Voor systeemeigen installatiekopieën is een kleinere initiële werkset vereist, omdat de JIT-compiler niet nodig is.

  • Systeemeigen installatiekopieën maken het delen van code mogelijk tussen processen.

  • Systeemeigen installatiekopieën vereisen meer schijfruimte dan CIL-assembly's en vereisen mogelijk veel tijd om te genereren.

  • Systeemeigen installatiekopieën moeten worden onderhouden.

    • Installatiekopieën moeten opnieuw worden gegenereerd wanneer de oorspronkelijke assembly of een van de afhankelijkheden wordt onderhouden.

    • Een enkele assembly heeft mogelijk meerdere systeemeigen installatiekopieën nodig voor gebruik in verschillende toepassingen of verschillende scenario's. De configuratiegegevens in twee toepassingen kunnen bijvoorbeeld leiden tot verschillende bindingsbeslissingen voor dezelfde afhankelijke assembly.

    • Systeemeigen installatiekopieën moeten worden gegenereerd door een beheerder; dat wil gezegd, van een Windows-account in de groep Administrators.

Naast deze algemene overwegingen moet de aard van uw toepassing worden overwogen bij het bepalen of systeemeigen installatiekopieën een prestatievoordeel kunnen bieden:

  • Als uw toepassing wordt uitgevoerd in een omgeving die gebruikmaakt van veel gedeelde onderdelen, kunnen de onderdelen door systeemeigen installatiekopieën worden gedeeld door meerdere processen.

  • Als uw toepassing meerdere toepassingsdomeinen gebruikt, staan systeemeigen installatiekopieën toe dat codepagina's worden gedeeld tussen domeinen.

    Notitie

    In .NET Framework-versies 1.0 en 1.1 kunnen systeemeigen installatiekopieën niet worden gedeeld tussen toepassingsdomeinen. Dit is niet het geval in versie 2.0 of hoger.

  • Als uw toepassing wordt uitgevoerd onder Terminal Server, staan systeemeigen installatiekopieën het delen van codepagina's toe.

  • Grote toepassingen profiteren over het algemeen van compilatie naar systeemeigen installatiekopieën. Kleine toepassingen profiteren over het algemeen niet.

  • Voor langlopende toepassingen presteert de runtime-JIT-compilatie iets beter dan systeemeigen installatiekopieën. (Harde binding kan dit prestatieverschil tot op zekere hoogte beperken.)

Belang van assemblybasisadressen

Omdat systeemeigen installatiekopieën Windows PE-bestanden zijn, zijn ze onderhevig aan dezelfde problemen als andere uitvoerbare bestanden. De prestatiekosten van herlocatie zijn nog duidelijker als harde binding wordt gebruikt.

Als u het basisadres voor een systeemeigen installatiekopieën wilt instellen, gebruikt u de juiste optie van uw compiler om het basisadres voor de assembly in te stellen. Ngen.exe gebruikt dit basisadres voor de systeemeigen installatiekopieën.

Notitie

Systeemeigen installatiekopieën zijn groter dan de beheerde assembly's waaruit ze zijn gemaakt. Basisadressen moeten worden berekend om deze grotere grootten mogelijk te maken.

U kunt een hulpprogramma zoals dumpbin.exe gebruiken om het voorkeursbasisadres van een systeemeigen installatiekopieën weer te geven.

Vaste binding

Harde binding verhoogt de doorvoer en vermindert de grootte van de werkset voor systeemeigen installatiekopieën. Het nadeel van harde binding is dat alle afbeeldingen die moeilijk zijn gebonden aan een assembly moeten worden geladen wanneer de assembly wordt geladen. Dit kan de opstarttijd voor een grote toepassing aanzienlijk verhogen.

Harde binding is geschikt voor afhankelijkheden die in alle prestatiekritieke scenario's van uw toepassing worden geladen. Net als bij elk aspect van systeemeigen gebruik van afbeeldingen zijn zorgvuldige prestatiemetingen de enige manier om te bepalen of de harde binding de prestaties van uw toepassing verbetert.

Met de DependencyAttribute en DefaultDependencyAttribute kenmerken kunt u vaste bindingshints opgeven voor Ngen.exe.

Notitie

Deze kenmerken zijn hints voor Ngen.exe, niet opdrachten. Het gebruik ervan garandeert geen harde binding. De betekenis van deze kenmerken kan in toekomstige releases veranderen.

Een bindingstip voor een afhankelijkheid opgeven

Pas de DependencyAttribute assembly toe op een assembly om de kans aan te geven dat een opgegeven afhankelijkheid wordt geladen. LoadHint.Always geeft aan dat harde binding geschikt is, Default geeft aan dat de standaardwaarde voor de afhankelijkheid moet worden gebruikt en Sometimes geeft aan dat harde binding niet geschikt is.

De volgende code toont de kenmerken voor een assembly met twee afhankelijkheden. De eerste afhankelijkheid (Assembly1) is een geschikte kandidaat voor harde binding en de tweede (Assembly2) is niet.

Imports System.Runtime.CompilerServices
<Assembly:DependencyAttribute("Assembly1", LoadHint.Always)>
<Assembly:DependencyAttribute("Assembly2", LoadHint.Sometimes)>
using System.Runtime.CompilerServices;
[assembly:DependencyAttribute("Assembly1", LoadHint.Always)]
[assembly:DependencyAttribute("Assembly2", LoadHint.Sometimes)]
using namespace System::Runtime::CompilerServices;
[assembly:DependencyAttribute("Assembly1", LoadHint.Always)];
[assembly:DependencyAttribute("Assembly2", LoadHint.Sometimes)];

De assemblynaam bevat niet de bestandsnaamextensie. Weergavenamen kunnen worden gebruikt.

Een standaardbindingstip opgeven voor een assembly

Standaardbindingshints zijn alleen nodig voor assembly's die onmiddellijk en vaak worden gebruikt door elke toepassing met een afhankelijkheid ervan. Pas de DefaultDependencyAttribute with LoadHint.Always toe op dergelijke assembly's om op te geven dat harde binding moet worden gebruikt.

Notitie

Er is geen reden om van toepassing te zijn op DefaultDependencyAttribute .dll assembly's die niet in deze categorie vallen, omdat het toepassen van het kenmerk met een andere waarde dan LoadHint.Always hetzelfde effect heeft als het helemaal niet toepassen van het kenmerk.

Microsoft gebruikt de DefaultDependencyAttribute opdracht om op te geven dat harde binding de standaardwaarde is voor een zeer klein aantal assembly's in .NET Framework, zoals mscorlib.dll.

Uitgestelde verwerking

Het genereren van systeemeigen installatiekopieën voor een zeer grote toepassing kan veel tijd in beslag nemen. Op dezelfde manier moeten veel systeemeigen installatiekopieën worden bijgewerkt als wijzigingen in een gedeeld onderdeel of wijzigingen in computerinstellingen. De install en update acties hebben een /queue optie waarmee de bewerking wordt in de wachtrij geplaatst voor uitgestelde uitvoering door de systeemeigen installatiekopieënservice. Daarnaast heeft Ngen.exe en queue executeQueuedItems acties die enige controle over de service bieden. Zie Native Image Service voor meer informatie.

Systeemeigen installatiekopieën en JIT-compilatie

Als Ngen.exe methoden ondervindt in een assembly die niet kan worden gegenereerd, worden deze uitgesloten van de systeemeigen installatiekopieën. Wanneer de runtime deze assembly uitvoert, wordt de JIT-compilatie hersteld voor de methoden die niet zijn opgenomen in de systeemeigen installatiekopieën.

Daarnaast worden systeemeigen installatiekopieën niet gebruikt als de assembly is bijgewerkt of als de installatiekopieën om welke reden dan ook ongeldig zijn gemaakt.

Ongeldige afbeeldingen

Wanneer u Ngen.exe gebruikt om een systeemeigen installatiekopie van een assembly te maken, is de uitvoer afhankelijk van de opdrachtregelopties die u opgeeft en bepaalde instellingen op uw computer. Deze instellingen omvatten het volgende:

  • De versie van .NET Framework.

  • De exacte identiteit van de assembly (hercompilatie wijzigt identiteit).

  • De exacte identiteit van alle assembly's waarnaar de assembly verwijst (hercompilatie wijzigt identiteit).

  • Beveiligingsfactoren.

Ngen.exe registreert deze informatie wanneer er een systeemeigen installatiekopieën worden gegenereerd. Wanneer u een assembly uitvoert, zoekt de runtime naar de systeemeigen installatiekopieën die zijn gegenereerd met opties en instellingen die overeenkomen met de huidige omgeving van de computer. De runtime wordt teruggezet naar JIT-compilatie van een assembly als er geen overeenkomende systeemeigen installatiekopieën kunnen worden gevonden. De volgende wijzigingen in de instellingen en omgeving van een computer zorgen ervoor dat systeemeigen installatiekopieën ongeldig worden:

  • De versie van .NET Framework.

    Als u een update toepast op .NET Framework, worden alle systeemeigen installatiekopieën die u hebt gemaakt met Ngen.exe ongeldig. Daarom voeren alle updates van .NET Framework de Ngen Update opdracht uit om ervoor te zorgen dat alle systeemeigen installatiekopieën opnieuw worden gegenereerd. .NET Framework maakt automatisch nieuwe systeemeigen installatiekopieën voor de .NET Framework-bibliotheken die worden geïnstalleerd.

  • De exacte identiteit van de assembly.

    Als u een assembly opnieuw compileert, wordt de bijbehorende systeemeigen installatiekopie van de assembly ongeldig.

  • De exacte identiteit van alle assembly's die de assemblyverwijzingen bevat.

    Als u een beheerde assembly bijwerkt, worden alle systeemeigen installatiekopieën die direct of indirect afhankelijk zijn van die assembly ongeldig en opnieuw moeten worden gegenereerd. Dit omvat zowel gewone verwijzingen als vaste afhankelijkheden. Wanneer een software-update wordt toegepast, moet het installatieprogramma een Ngen Update opdracht uitvoeren om ervoor te zorgen dat alle afhankelijke systeemeigen installatiekopieën opnieuw worden gegenereerd.

  • Beveiligingsfactoren.

    Als u het beveiligingsbeleid voor computers wijzigt om machtigingen te beperken die eerder aan een assembly zijn verleend, kan dit ertoe leiden dat een eerder gecompileerde systeemeigen installatiekopieën voor die assembly ongeldig worden.

    Zie Code Access Security voor gedetailleerde informatie over hoe de algemene taalruntime codetoegangsbeveiliging beheert en hoe u machtigingen gebruikt.

Probleemoplossing

Met de volgende onderwerpen over probleemoplossing kunt u zien welke systeemeigen installatiekopieën worden gebruikt en die niet kunnen worden gebruikt door uw toepassing, om te bepalen wanneer de JIT-compiler een methode gaat compileren en laat zien hoe u zich kunt afmelden voor systeemeigen installatiekopieëncompilatie van opgegeven methoden.

Logboekviewer voor assemblybinding

Als u wilt controleren of systeemeigen installatiekopieën door uw toepassing worden gebruikt, kunt u de Fuslogvw.exe (Assembly Binding Log Viewer) gebruiken. Selecteer Systeemeigen installatiekopieën in het vak Logboekcategorieën in het venster bindingslogboekviewer. Fuslogvw.exe bevat informatie over waarom een systeemeigen installatiekopieën zijn geweigerd.

De door JITCompilationStart beheerde foutopsporingsassistent

U kunt de door jitCompilationStart beheerde foutopsporingsassistent (MDA) gebruiken om te bepalen wanneer de JIT-compiler een functie gaat compileren.

Afmelden voor systeemeigen generatie van installatiekopieën

In sommige gevallen kan NGen.exe problemen hebben bij het genereren van een systeemeigen installatiekopieën voor een specifieke methode, of misschien wilt u dat de methode JIT is gecompileerd in plaats van dat deze wordt gecompileerd naar een systeemeigen installatiekopieën. In dit geval kunt u het System.Runtime.BypassNGenAttribute kenmerk gebruiken om te voorkomen dat NGen.exe een systeemeigen installatiekopieën voor een bepaalde methode genereert. Het kenmerk moet afzonderlijk worden toegepast op elke methode waarvan u de code niet wilt opnemen in de systeemeigen installatiekopieën. NGen.exe herkent het kenmerk en genereert geen code in de systeemeigen installatiekopieën voor de bijbehorende methode.

Houd er echter rekening mee dat dit BypassNGenAttribute niet is gedefinieerd als een type in de .NET Framework-klassebibliotheek. Als u het kenmerk in uw code wilt gebruiken, moet u het eerst als volgt definiëren:

namespace System.Runtime
{
   [AttributeUsage(AttributeTargets.Method |
                   AttributeTargets.Constructor |
                   AttributeTargets.Property)]
   public class BypassNGenAttribute : Attribute
   {
   }
}
Namespace System.Runtime
    <AttributeUsage(AttributeTargets.Method Or
                    AttributeTargets.Constructor Or
                    AttributeTargets.Property)>
    Public Class BypassNGenAttribute : Inherits Attribute
    End Class
End Namespace

Vervolgens kunt u het kenmerk per methode toepassen. In het volgende voorbeeld wordt de systeemeigen installatiekopieëngenerator geïnstrueerd dat er geen systeemeigen installatiekopieën voor de ExampleClass.ToJITCompile methode moeten worden gegenereerd.

using System;
using System.Runtime;

public class ExampleClass
{
   [BypassNGen]
   public void ToJITCompile()
   {
   }
}
Imports System.Runtime

Public Class ExampleClass
    <BypassNGen>
    Public Sub ToJITCompile()
    End Sub
End Class

Voorbeelden

De volgende opdracht genereert een systeemeigen installatiekopieën voor ClientApp.exe, die zich in de huidige map bevinden en installeert de installatiekopieën in de systeemeigen installatiekopieëncache. Als er een configuratiebestand bestaat voor de assembly, Ngen.exe dit gebruikt. Daarnaast worden systeemeigen installatiekopieën gegenereerd voor alle .dll bestanden waarnaar ClientApp.exe wordt verwezen.

ngen install ClientApp.exe

Een installatiekopieën die zijn geïnstalleerd met Ngen.exe worden ook wel een hoofdmap genoemd. Een hoofdmap kan een toepassing of een gedeeld onderdeel zijn.

Met de volgende opdracht wordt een systeemeigen installatiekopieën gegenereerd voor MyAssembly.exe met het opgegeven pad.

ngen install c:\myfiles\MyAssembly.exe

Wanneer u assembly's en hun afhankelijkheden opzoekt, gebruikt Ngen.exe dezelfde testlogica die wordt gebruikt door de algemene taalruntime. De map die deze bevat ClientApp.exe , wordt standaard gebruikt als de basismap van de toepassing en alle assemblyprobing begint in deze map. U kunt dit gedrag overschrijven met behulp van de /AppBase optie.

Notitie

Dit is een wijziging van Ngen.exe gedrag in .NET Framework-versies 1.0 en 1.1, waarbij de toepassingsbasis is ingesteld op de huidige map.

Een assembly kan een afhankelijkheid hebben zonder verwijzing, bijvoorbeeld als er een .dll-bestand wordt geladen met behulp van de Assembly.Load methode. U kunt een systeemeigen installatiekopieën maken voor een dergelijk .dll bestand met behulp van configuratiegegevens voor de toepassingsassembly, met de /ExeConfig optie. Met de volgende opdracht wordt een systeemeigen installatiekopieën gegenereerd voor MyLib.dll het gebruik van de configuratiegegevens van MyApp.exe.

ngen install c:\myfiles\MyLib.dll /ExeConfig:c:\myapps\MyApp.exe

Assembly's die op deze manier zijn geïnstalleerd, worden niet verwijderd wanneer de toepassing wordt verwijderd.

Als u een afhankelijkheid wilt verwijderen, gebruikt u dezelfde opdrachtregelopties die zijn gebruikt om deze te installeren. Met de volgende opdracht wordt het MyLib.dll uit het vorige voorbeeld verwijderd.

ngen uninstall c:\myfiles\MyLib.dll /ExeConfig:c:\myapps\MyApp.exe

Als u een systeemeigen installatiekopieën wilt maken voor een assembly in de globale assemblycache, gebruikt u de weergavenaam van de assembly. Voorbeeld:

ngen install "ClientApp, Version=1.0.0.0, Culture=neutral,
  PublicKeyToken=3c7ba247adcd2081, processorArchitecture=MSIL"

NGen.exe genereert een afzonderlijke set installatiekopieën voor elk scenario dat u installeert. Met de volgende opdrachten installeert u bijvoorbeeld een volledige set systeemeigen installatiekopieën voor normale bewerking, een andere volledige set voor foutopsporing en een derde voor profilering:

ngen install MyApp.exe
ngen install MyApp.exe /debug
ngen install MyApp.exe /profile

De systeemeigen afbeeldingscache weergeven

Zodra systeemeigen installatiekopieën in de cache zijn geïnstalleerd, kunnen ze worden weergegeven met behulp van Ngen.exe. Met de volgende opdracht worden alle systeemeigen installatiekopieën in de systeemeigen installatiekopieëncache weergegeven.

ngen display

De display actie bevat eerst alle hoofdassembly's, gevolgd door een lijst met alle systeemeigen installatiekopieën op de computer.

Gebruik de eenvoudige naam van een assembly om alleen informatie voor die assembly weer te geven. Met de volgende opdracht worden alle systeemeigen installatiekopieën in de systeemeigen installatiekopiecache weergegeven die overeenkomen met de gedeeltelijke naamMyAssembly, de bijbehorende afhankelijkheden en alle hoofdmappen waarvoor een afhankelijkheid is:MyAssembly

ngen display MyAssembly

Weten welke wortels afhankelijk zijn van een gedeelde componentassembly is handig bij het bepalen van de impact van een update actie nadat het gedeelde onderdeel is bijgewerkt.

Als u de bestandsextensie van een assembly opgeeft, moet u het pad opgeven of Ngen.exe uitvoeren vanuit de map die de assembly bevat:

ngen display c:\myApps\MyAssembly.exe

Met de volgende opdracht worden alle systeemeigen installatiekopieën in de systeemeigen installatiekopieëncache weergegeven met de naam MyAssembly en versie 1.0.0.0.

ngen display "myAssembly, version=1.0.0.0"

Afbeeldingen bijwerken

Installatiekopieën worden doorgaans bijgewerkt nadat een gedeeld onderdeel is bijgewerkt. Als u alle systeemeigen installatiekopieën wilt bijwerken die zijn gewijzigd of waarvan de afhankelijkheden zijn gewijzigd, gebruikt u de update actie zonder argumenten.

ngen update

Het bijwerken van alle afbeeldingen kan een langdurig proces zijn. U kunt de updates in de wachtrij plaatsen voor uitvoering door de systeemeigen installatiekopieënservice met behulp van de /queue optie. Zie Native Image Service voor meer informatie over de /queue optie en installatieprioriteiten.

ngen update /queue

Installatiekopieën verwijderen

Ngen.exe een lijst met afhankelijkheden onderhoudt, zodat gedeelde onderdelen alleen worden verwijderd wanneer alle assembly's die ervan afhankelijk zijn, zijn verwijderd. Daarnaast wordt een gedeeld onderdeel niet verwijderd als het als hoofdonderdeel is geïnstalleerd.

Met de volgende opdracht worden alle scenario's voor de hoofdmap ClientApp.exeverwijderd:

ngen uninstall ClientApp

De uninstall actie kan worden gebruikt om specifieke scenario's te verwijderen. Met de volgende opdracht verwijdert u alle foutopsporingsscenario's voor ClientApp.exe:

ngen uninstall ClientApp /debug

Notitie

Bij het verwijderen van /debug scenario's wordt geen scenario verwijderd dat zowel /profile als /debug.

Met de volgende opdracht worden alle scenario's voor een specifieke versie van ClientApp.exe:

ngen uninstall "ClientApp, Version=1.0.0.0"

Met de volgende opdrachten verwijdert u alle scenario's voor "ClientApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3c7ba247adcd2081, processorArchitecture=MSIL", of alleen het foutopsporingsscenario voor die assembly:

ngen uninstall "ClientApp, Version=1.0.0.0, Culture=neutral,
  PublicKeyToken=3c7ba247adcd2081, processorArchitecture=MSIL"
ngen uninstall "ClientApp, Version=1.0.0.0, Culture=neutral,
  PublicKeyToken=3c7ba247adcd2081, processorArchitecture=MSIL" /debug

Net als bij de install actie vereist het opgeven van een extensie het uitvoeren van Ngen.exe vanuit de map met de assembly of het opgeven van een volledig pad.

Zie Native Image Service voor voorbeelden met betrekking tot de systeemeigen installatiekopieservice.

Systeemeigen installatiekopieëntaak

De systeemeigen installatiekopieëntaak is een Windows-taak waarmee systeemeigen installatiekopieën worden gegenereerd en onderhouden. Met de systeemeigen installatiekopieëntaak worden systeemeigen installatiekopieën automatisch gegenereerd en vrijgemaakt voor ondersteunde scenario's. Ook kunnen installatieprogramma's Ngen.exe (Native Image Generator) gebruiken om systeemeigen installatiekopieën op een uitgestelde tijd te maken en bij te werken.

De systeemeigen installatiekopieëntaak wordt eenmaal geregistreerd voor elke CPU-architectuur die wordt ondersteund op een computer, om compilatie toe te staan voor toepassingen die gericht zijn op elke architectuur:

Taaknaam 32-bits computer 64-bits computer
NET Framework NGEN v4.0.30319 Ja Ja
NET Framework NGEN v4.0.30319 64 Nr. Ja

De systeemeigen installatiekopieëntaak is beschikbaar in .NET Framework 4.5 en hoger wanneer deze wordt uitgevoerd in Windows 8 of hoger. In eerdere versies van Windows gebruikt .NET Framework de Native Image Service.

Levensduur van taak

Over het algemeen start de Windows Task Scheduler elke nacht de systeemeigen installatiekopieëntaak wanneer de computer inactief is. De taak controleert op uitgestelde werkzaamheden die in de wachtrij worden geplaatst door installatieprogramma's van toepassingen, eventuele uitgestelde aanvragen voor systeemeigen installatiekopieënupdates en het automatisch maken van installatiekopieën. De taak voltooit openstaande werkitems en wordt vervolgens afgesloten. Als de computer niet meer actief is terwijl de taak wordt uitgevoerd, stopt de taak.

U kunt de systeemeigen installatiekopieëntaak ook handmatig starten via de gebruikersinterface van Task Scheduler of via handmatige aanroepen naar NGen.exe. Als de taak via een van deze methoden wordt gestart, blijft deze actief wanneer de computer niet meer inactief is. Installatiekopieën die handmatig worden gemaakt met behulp van NGen.exe krijgen prioriteit om voorspelbaar gedrag voor toepassingsinstallatieprogramma's mogelijk te maken.

Systeemeigen installatiekopieënservice

De systeemeigen installatiekopieënservice is een Windows-service waarmee systeemeigen installatiekopieën worden gegenereerd en onderhouden. Met de systeemeigen installatiekopieservice kan de ontwikkelaar de installatie en update van systeemeigen installatiekopieën uitstellen tot perioden waarop de computer niet actief is.

Normaal gesproken wordt de systeemeigen installatiekopieënservice gestart door het installatieprogramma (installatieprogramma) voor een toepassing of update. Voor acties met prioriteit 3 wordt de service uitgevoerd tijdens inactieve tijd op de computer. De service slaat de status op en kan indien nodig doorgaan met meerdere herstarts. Er kunnen meerdere compilaties van installatiekopieën in de wachtrij worden geplaatst.

De service communiceert ook met de handmatige Ngen.exe opdracht. Handmatige opdrachten hebben voorrang op achtergrondactiviteit.

Notitie

In Windows Vista is de naam die wordt weergegeven voor de systeemeigen installatiekopieservice 'Microsoft.NET Framework NGEN v2.0.50727_X86' of 'Microsoft.NET Framework NGEN v2.0.50727_X64'. In alle eerdere versies van Microsoft Windows is de naam '.NET Runtime Optimization Service v2.0.50727_X86' of '.NET Runtime Optimization Service v2.0.50727_X64'.

Uitgestelde bewerkingen starten

Voordat u een installatie of upgrade start, wordt het onderbreken van de service aanbevolen. Dit zorgt ervoor dat de service niet wordt uitgevoerd terwijl het installatieprogramma bestanden kopieert of assembly's in de globale assemblycache plaatst. Met de volgende Ngen.exe opdrachtregel wordt de service onderbroken:

ngen queue pause

Wanneer alle uitgestelde bewerkingen in de wachtrij zijn geplaatst, kan de service met de volgende opdracht worden hervat:

ngen queue continue

Als u het genereren van systeemeigen installatiekopieën wilt uitstellen bij het installeren van een nieuwe toepassing of bij het bijwerken van een gedeeld onderdeel, gebruikt u de /queue optie met de install of update acties. De volgende Ngen.exe opdrachtregels installeren een systeemeigen installatiekopieën voor een gedeeld onderdeel en een update uitvoeren van alle wortels die mogelijk zijn beïnvloed:

ngen install MyComponent /queue
ngen update /queue

De update actie genereert alle systeemeigen installatiekopieën die ongeldig zijn gemaakt, niet alleen de installatiekopieën die worden gebruikt MyComponent.

Als uw toepassing uit veel hoofdmappen bestaat, kunt u de prioriteit van de uitgestelde acties beheren. Met de volgende opdrachten wordt de installatie van drie hoofdmappen in de wachtrij geplaatst. Assembly1 wordt eerst geïnstalleerd, zonder te wachten op niet-actieve tijd. Assembly2 wordt ook geïnstalleerd zonder te wachten op niet-actieve tijd, maar nadat alle acties met prioriteit 1 zijn voltooid. Assembly3 wordt geïnstalleerd wanneer de service detecteert dat de computer inactief is.

ngen install Assembly1 /queue:1
ngen install Assembly2 /queue:2
ngen install Assembly3 /queue:3

U kunt afdwingen dat acties in de wachtrij synchroon worden uitgevoerd met behulp van de executeQueuedItems actie. Als u de optionele prioriteit opgeeft, is deze actie alleen van invloed op de acties in de wachtrij met een gelijke of lagere prioriteit. De standaardprioriteit is 3, dus de volgende Ngen.exe opdracht verwerkt alle acties in de wachtrij onmiddellijk en wordt pas geretourneerd als ze zijn voltooid:

ngen executeQueuedItems

Synchrone opdrachten worden uitgevoerd door Ngen.exe en maken geen gebruik van de systeemeigen installatiekopieënservice. U kunt acties uitvoeren met behulp van Ngen.exe terwijl de systeemeigen installatiekopieënservice wordt uitgevoerd.

Service afsluiten

Nadat de service is gestart door de uitvoering van een Ngen.exe opdracht die de /queue optie bevat, wordt de service op de achtergrond uitgevoerd totdat alle acties zijn voltooid. De service slaat de status op, zodat deze zo nodig meerdere herstarts kan doorlopen. Wanneer de service detecteert dat er geen acties meer in de wachtrij staan, wordt de status opnieuw ingesteld, zodat de computer niet opnieuw wordt opgestart wanneer de computer de volgende keer wordt opgestart en vervolgens wordt afgesloten.

Serviceinteractie met clients

In .NET Framework versie 2.0 is de enige interactie met de systeemeigen installatiekopieservice via het opdrachtregelprogramma Ngen.exe. Gebruik het opdrachtregelprogramma in installatiescripts om acties voor de systeemeigen installatiekopieservice in de wachtrij te plaatsen en om te communiceren met de service.

Zie ook