Å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 etttry
block och i slutet fråntry
blocket, och samma villkor utvärderas icatch
ellerfinally
-blocket, tar den nya 64-bitars JIT-kompilatorn bort villkoretif
catch
från ellerfinally
-blocket när koden optimeras. Därför körs kod i -instruktionenif
catch
i ellerfinally
-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 namnetuseLegacyJit
tillHKEY_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 namnetuseLegacyJit
tillHKEY_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.