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ím try bloku a při ukončení try bloku a vyhodnocuje se stejná podmínka v catch bloku nebo finally bloku, nový 64bitový kompilátor JIT odebere if podmínku catch z bloku nebo finally bloku, když optimalizuje kód. V důsledku toho se kód uvnitř if příkazu v catch bloku finally 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_DWORDuseLegacyJit k HKEY_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_DWORDuseLegacyJit k HKEY_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í.

Viz také