Omezení rizik: Nový 64bitový kompilátor JIT
Počínaje rozhraním .NET Framework 4.6 modul runtime obsahuje nový 64bitový kompilátor JIT pro kompilaci za běhu. Tato změna nemá vliv na kompilaci s 32bitovým kompilátorem JIT.
Neočekávané chování nebo výjimky
V některých případech má kompilace s novým 64bitovým kompilátorem JIT za následek výjimku za běhu nebo chování, které se při spouštění kódu kompilovaného starším 64bitovým kompilátorem JIT nezjistí. Mezi známé rozdíly patří:
Důležité
Všechny tyto známé problémy byly vyřešeny v novém 64bitovém kompilátoru vydaném v rozhraní .NET Framework 4.6.2. Většina se také řeší ve verzích služeb rozhraní .NET Framework 4.6 a 4.6.1, které jsou součástí služba Windows Update. Tyto problémy můžete odstranit tak, že zajistíte, že je vaše verze Windows aktuální, nebo upgradem na rozhraní .NET Framework 4.6.2.
Za určitých podmínek může operace rozbalení vyvolat v buildech vydané verze se zapnutou NullReferenceException optimalizací.
V některých případech může spuštění produkčního kódu ve velkém těle metody vyvolat StackOverflowException.
Za určitých podmínek se struktury předané metodě považují za odkazové typy místo hodnotových typů v buildech Release. Jedním z projevů tohoto problému je, že jednotlivé položky v kolekci se zobrazují v neočekávaném pořadí.
Za určitých podmínek je porovnání UInt16 hodnot s vysokou bitovou sadou nesprávné, pokud je povolená optimalizace.
Za určitých podmínek, zejména při inicializaci hodnot pole, inicializace paměti inicializací OpCodes.Initblk instrukce IL může inicializovat paměť s nesprávnou hodnotou. Výsledkem může být neošetřená výjimka nebo nesprávný výstup.
Za určitých výjimečných podmínek může podmíněný bitový test vrátit nesprávnou Boolean hodnotu nebo vyvolat výjimku, pokud jsou povoleny optimalizace kompilátoru.
Za určitých podmínek platí, že pokud
if
se příkaz použije k otestování podmínky před zadánímtry
bloku a při ukončenítry
bloku a vyhodnocuje se stejná podmínka vcatch
bloku nebofinally
bloku, nový 64bitový kompilátor JIT odebereif
podmínkucatch
z bloku nebofinally
bloku, když optimalizuje kód. V důsledku toho se kód uvnitřif
příkazu vcatch
blokufinally
provede bezpodmínečně.
Zmírnění známých problémů
Pokud narazíte na výše uvedené problémy, můžete je vyřešit některým z následujících způsobů:
Upgradujte na rozhraní .NET Framework 4.6.2. Nový 64bitový kompilátor, který je součástí rozhraní .NET Framework 4.6.2, řeší každý z těchto známých problémů.
Spuštěním služba Windows Update se ujistěte, že je vaše verze Windows aktuální. Aktualizace služeb pro rozhraní .NET Framework 4.6 a 4.6.1 řeší všechny tyto problémy s výjimkou NullReferenceException operace rozbalování.
Zkompilujte pomocí staršího 64bitového kompilátoru JIT. Další informace o tom, jak to udělat, najdete v části Zmírnění dalších problémů .
Zmírnění jiných problémů
Pokud narazíte na jakýkoli jiný rozdíl v chování mezi kódem zkompilovaným pomocí staršího 64bitového kompilátoru a nového 64bitového kompilátoru JIT nebo mezi verzemi ladění a verze aplikace, které jsou kompilovány s novým 64bitovým kompilátorem JIT, můžete aplikaci zkompilovat pomocí staršího 64bitového kompilátoru JIT:
Pro jednotlivé aplikace můžete přidat <element useLegacyJit> do konfiguračního souboru vaší aplikace. Následující příkaz zakáže kompilaci s novým 64bitovým kompilátorem JIT a místo toho používá starší 64bitový kompilátor JIT.
<?xml version ="1.0"?> <configuration> <runtime> <useLegacyJit enabled="1" /> </runtime> </configuration>
Pro jednotlivé uživatele můžete přidat hodnotu pojmenovanou
REG_DWORD
useLegacyJit
kHKEY_CURRENT_USER\SOFTWARE\Microsoft\.NETFramework
klíči registru. Hodnota 1 umožňuje starší 64bitový kompilátor JIT; hodnota 0 ji zakáže a povolí nový 64bitový kompilátor JIT.Na základě jednotlivých počítačů můžete přidat hodnotu pojmenovanou
REG_DWORD
useLegacyJit
kHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework
klíči registru. Hodnota 1 umožňuje starší 64bitový kompilátor JIT; hodnota 0 ji zakáže a povolí nový 64bitový kompilátor JIT.
O problému nám také můžete dát vědět tím, že nahlásíte chybu na webu Microsoft Připojení.