Dela via


Åtgärd: Ny 64-bitars JIT-kompilator

Från och med .NET Framework 4.6 innehåller körningen en ny 64-bitars JIT-kompilator för just-in-time-kompilering. Den här ändringen påverkar inte kompilering med 32-bitars JIT-kompilatorn.

Oväntat beteende eller undantag

I vissa fall resulterar kompilering med den nya 64-bitars JIT-kompilatorn i ett körningsundatag eller ett beteende som inte observeras vid körning av kod som kompilerats av den äldre 64-bitars JIT-kompilatorn. De kända skillnaderna omfattar följande:

Viktigt!

Alla dessa kända problem har åtgärdats i den nya 64-bitars kompilatorn som släpptes med .NET Framework 4.6.2. De flesta har också åtgärdats i tjänstversioner av .NET Framework 4.6 och 4.6.1 som ingår i Windows Update. Du kan eliminera dessa problem genom att se till att din version av Windows är uppdaterad eller genom att uppgradera till .NET Framework 4.6.2.

  • Under vissa förhållanden kan en unboxing-åtgärd utlösa en NullReferenceException i Versionsversioner med optimering aktiverad.

  • I vissa fall kan körning av produktionskod i en stor metodtext utlösa en StackOverflowException.

  • Under vissa förhållanden behandlas strukturer som skickas till en metod som referenstyper i stället för värdetyper i Versionsversioner. En av manifestationerna av det här problemet är att de enskilda objekten i en samling visas i en oväntad ordning.

  • Under vissa förhållanden är jämförelsen av UInt16 värden med deras höga bituppsättning felaktig om optimering är aktiverat.

  • Under vissa förhållanden, särskilt vid initiering av matrisvärden, kan minnesinitiering av IL-instruktionen OpCodes.Initblk initiera minne med ett felaktigt värde. Detta kan resultera i antingen ett ohanterat undantag eller felaktiga utdata.

  • Under vissa sällsynta förhållanden kan ett villkorligt bittest returnera det felaktiga Boolean värdet eller utlösa ett undantag om kompilatoroptimeringar är aktiverade.

  • Under vissa förhållanden, om en if -instruktion används för att testa för ett villkor innan du anger ett try block och i slutet från try blocket, och samma villkor utvärderas i catch eller finally -blocket, tar den nya 64-bitars JIT-kompilatorn bort villkoret ifcatch från eller finally -blocket när koden optimeras. Därför körs kod i -instruktionen ifcatch i eller finally -blocket villkorslöst.

Åtgärda kända problem

Om du stöter på problemen ovan kan du åtgärda dem genom att göra något av följande:

  • Uppgradera till .NET Framework 4.6.2. Den nya 64-bitars kompilatorn som ingår i .NET Framework 4.6.2 åtgärdar vart och ett av dessa kända problem.

  • Kontrollera att din version av Windows är uppdaterad genom att köra Windows Update. Tjänstuppdateringar till .NET Framework 4.6 och 4.6.1 löser vart och ett av dessa problem förutom NullReferenceException i en unboxing-åtgärd.

  • Kompilera med den äldre 64-bitars JIT-kompilatorn. Mer information om hur du gör detta finns i avsnittet Åtgärda andra problem .

Åtgärd av andra problem

Om du stöter på någon annan skillnad i beteende mellan kod som kompilerats med den äldre 64-bitars kompilatorn och den nya 64-bitars JIT-kompilatorn, eller mellan felsöknings- och versionsversionerna av din app som båda kompileras med den nya 64-bitars JIT-kompilatorn, kan du göra följande för att kompilera din app med den äldre 64-bitars JIT-kompilatorn:

  • Per program kan du lägga till elementet <useLegacyJit> i programmets konfigurationsfil. Följande inaktiverar kompilering med den nya 64-bitars JIT-kompilatorn och använder i stället den äldre 64-bitars JIT-kompilatorn.

    <?xml version ="1.0"?>  
    <configuration>  
        <runtime>  
           <useLegacyJit enabled="1" />  
        </runtime>  
    </configuration>  
    
  • Per användare kan du lägga till ett REG_DWORD värde med namnet useLegacyJit till HKEY_CURRENT_USER\SOFTWARE\Microsoft\.NETFramework registrets nyckel. Värdet 1 aktiverar den äldre 64-bitars JIT-kompilatorn. värdet 0 inaktiverar det och aktiverar den nya 64-bitars JIT-kompilatorn.

  • Per dator kan du lägga till ett REG_DWORD värde med namnet useLegacyJit till HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework nyckeln i registret. Värdet 1 aktiverar den äldre 64-bitars JIT-kompilatorn. värdet 0 inaktiverar det och aktiverar den nya 64-bitars JIT-kompilatorn.

Du kan också meddela oss om problemet genom att rapportera en bugg på Microsoft Anslut.

Se även