Delen via


Risicobeperking: nieuwe 64-bits JIT-compiler

Vanaf .NET Framework 4.6 bevat de runtime een nieuwe 64-bits JIT-compiler voor Just-In-Time-compilatie. Deze wijziging heeft geen invloed op compilatie met de 32-bits JIT-compiler.

Onverwacht gedrag of uitzonderingen

In sommige gevallen resulteert compilatie met de nieuwe 64-bits JIT-compiler in een runtime-uitzondering of gedrag dat niet wordt waargenomen bij het uitvoeren van code die is gecompileerd door de oudere 64-bits JIT-compiler. De bekende verschillen zijn onder andere:

Belangrijk

Al deze bekende problemen zijn opgelost in de nieuwe 64-bits compiler die is uitgebracht met .NET Framework 4.6.2. De meeste zijn ook behandeld in servicereleases van .NET Framework 4.6 en 4.6.1 die zijn opgenomen in Windows Update. U kunt deze problemen elimineren door ervoor te zorgen dat uw versie van Windows up-to-date is of door een upgrade uit te voeren naar .NET Framework 4.6.2.

  • Onder bepaalde voorwaarden kan een uitboxing-bewerking een NullReferenceException release-builds genereren met optimalisatie ingeschakeld.

  • In sommige gevallen kan de uitvoering van productiecode in een grote methodetekst een StackOverflowException.

  • Onder bepaalde voorwaarden worden structuren die worden doorgegeven aan een methode beschouwd als referentietypen in plaats van waardetypen in Release-builds. Een van de manifestaties van dit probleem is dat de afzonderlijke items in een verzameling in een onverwachte volgorde worden weergegeven.

  • Onder bepaalde omstandigheden is de vergelijking van UInt16 waarden met hun hoge bitset onjuist als optimalisatie is ingeschakeld.

  • Onder bepaalde omstandigheden, met name bij het initialiseren van matrixwaarden, kan de initialisatie van het geheugen door de OpCodes.Initblk IL-instructie geheugen initialiseren met een onjuiste waarde. Dit kan resulteren in een niet-verwerkte uitzondering of onjuiste uitvoer.

  • Onder bepaalde zeldzame omstandigheden kan een voorwaardelijke bittest de onjuiste Boolean waarde retourneren of een uitzondering genereren als compileroptimalisaties zijn ingeschakeld.

  • Als onder bepaalde voorwaarden een if instructie wordt gebruikt om te testen op een voorwaarde voordat u een try blok invoert en in de uitgang van het try blok, en dezelfde voorwaarde wordt geĆ«valueerd in het catch of finally blok, verwijdert de nieuwe 64-bits JIT-compiler de if voorwaarde uit de catch of finally blokkering wanneer code wordt geoptimaliseerd. Als gevolg hiervan wordt code in de if instructie in het catch of finally blok onvoorwaardelijke uitgevoerd.

Beperking van bekende problemen

Als u de bovenstaande problemen ondervindt, kunt u deze oplossen door een van de volgende handelingen uit te voeren:

  • Voer een upgrade uit naar .NET Framework 4.6.2. De nieuwe 64-bits compiler die deel uitmaakt van .NET Framework 4.6.2, lost elk van deze bekende problemen op.

  • Zorg ervoor dat uw versie van Windows up-to-date is door Windows Update uit te voeren. Service-updates voor .NET Framework 4.6 en 4.6.1 verhelpen elk van deze problemen, behalve de NullReferenceException in een uitbox-bewerking.

  • Compileer met de oudere 64-bits JIT-compiler. Zie de sectie Oplossingen voor andere problemen voor meer informatie over hoe u dit doet.

Risicobeperking van andere problemen

Als er een ander verschil in gedrag is tussen code die is gecompileerd met de oudere 64-bits compiler en de nieuwe 64-bits JIT-compiler, of tussen de foutopsporings- en releaseversies van uw app die beide zijn gecompileerd met de nieuwe 64-bits JIT-compiler, kunt u het volgende doen om uw app te compileren met de oudere 64-bits JIT-compiler:

  • Per toepassing kunt u het useLegacyJit-element> toevoegen aan het <configuratiebestand van uw toepassing. Met het volgende wordt compilatie met de nieuwe 64-bits JIT-compiler uitgeschakeld en wordt in plaats daarvan de verouderde 64-bits JIT-compiler gebruikt.

    <?xml version ="1.0"?>  
    <configuration>  
        <runtime>  
           <useLegacyJit enabled="1" />  
        </runtime>  
    </configuration>  
    
  • U kunt per gebruiker een REG_DWORD waarde met de naam useLegacyJit toevoegen aan de HKEY_CURRENT_USER\SOFTWARE\Microsoft\.NETFramework sleutel van het register. Een waarde van 1 maakt de verouderde 64-bits JIT-compiler mogelijk; met de waarde 0 wordt deze uitgeschakeld en wordt de nieuwe 64-bits JIT-compiler ingeschakeld.

  • U kunt per machine een REG_DWORD waarde met de naam useLegacyJit toevoegen aan de HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework sleutel van het register. Een waarde van 1 maakt de verouderde 64-bits JIT-compiler mogelijk; met de waarde 0 wordt deze uitgeschakeld en wordt de nieuwe 64-bits JIT-compiler ingeschakeld.

U kunt ons ook op de hoogte stellen van het probleem door een bug op Microsoft Verbinding maken te melden.

Zie ook