Udostępnij za pośrednictwem


Środki zaradcze: nowy 64-bitowy kompilator JIT

Począwszy od programu .NET Framework 4.6, środowisko uruchomieniowe zawiera nowy 64-bitowy kompilator JIT na potrzeby kompilacji typu just in time. Ta zmiana nie ma wpływu na kompilację z 32-bitowym kompilatorem JIT.

Nieoczekiwane zachowanie lub wyjątki

W niektórych przypadkach kompilacja z nowym 64-bitowym kompilatorem JIT powoduje wyjątek środowiska uruchomieniowego lub zachowanie, które nie jest obserwowane podczas wykonywania kodu skompilowanego przez starszy 64-bitowy kompilator JIT. Znane różnice obejmują następujące elementy:

Ważne

Wszystkie te znane problemy zostały rozwiązane w nowym kompilatorze 64-bitowym wydanym za pomocą programu .NET Framework 4.6.2. Większość z nich została również rozwiązana w wersjach usług programu .NET Framework 4.6 i 4.6.1, które są dołączone do usługi Windows Update. Możesz wyeliminować te problemy, upewniając się, że wersja systemu Windows jest aktualna lub przez uaktualnienie do programu .NET Framework 4.6.2.

  • W pewnych warunkach operacja rozpatrunia może zgłaszać NullReferenceException kompilacje wydania z włączoną optymalizacją.

  • W niektórych przypadkach wykonanie kodu produkcyjnego w dużej treści metody może zgłosić błąd StackOverflowException.

  • W pewnych warunkach struktury przekazywane do metody są traktowane jako typy referencyjne, a nie typy wartości w kompilacjach wydania. Jednym z objawów tego problemu jest to, że poszczególne elementy w kolekcji pojawiają się w nieoczekiwanej kolejności.

  • W pewnych warunkach porównanie wartości z ich zestawem bitów UInt16 jest niepoprawne, jeśli włączono optymalizację.

  • W pewnych warunkach, szczególnie podczas inicjowania wartości tablicy, inicjowanie pamięci przez OpCodes.Initblk instrukcję IL może zainicjować pamięć z nieprawidłową wartością. Może to spowodować nieobsługiwany wyjątek lub nieprawidłowe dane wyjściowe.

  • W pewnych rzadkich warunkach test bitowy warunkowy może zwrócić nieprawidłową Boolean wartość lub zgłosić wyjątek, jeśli włączono optymalizacje kompilatora.

  • W pewnych warunkach, jeśli instrukcja if jest używana do testowania warunku przed wprowadzeniem try bloku i wyjścia z try bloku, a ten sam warunek jest obliczany w catch bloku lub finally , nowy kompilator 64-bitowy JIT usuwa if warunek z catch bloku lub finally podczas optymalizowania kodu. W rezultacie kod wewnątrz instrukcji if w catch bloku or finally jest wykonywany bezwarunkowo.

Środki zaradcze znanych problemów

Jeśli napotkasz wymienione powyżej problemy, możesz rozwiązać je, wykonując dowolną z następujących czynności:

  • Uaktualnij program .NET Framework do wersji 4.6.2. Nowy kompilator 64-bitowy dołączony do programu .NET Framework 4.6.2 rozwiązuje każde z tych znanych problemów.

  • Upewnij się, że twoja wersja systemu Windows jest aktualna, uruchamiając usługę Windows Update. Aktualizacje usług programu .NET Framework 4.6 i 4.6.1 dotyczą każdego z tych problemów, z wyjątkiem NullReferenceException operacji rozpakowania.

  • Kompiluj przy użyciu starszego 64-bitowego kompilatora JIT. Aby uzyskać więcej informacji na temat tego, jak to zrobić, zobacz sekcję Środki zaradcze innych problemów .

Środki zaradcze innych problemów

Jeśli wystąpi inna różnica w zachowaniu między kodem skompilowanym ze starszym kompilatorem 64-bitowym i nowym kompilatorem JIT 64-bitowym lub między wersjami debugowania i wydania aplikacji skompilowanymi przy użyciu nowego kompilatora JIT w wersji 64-bitowej, możesz wykonać następujące czynności, aby skompilować aplikację przy użyciu starszego kompilatora JIT w wersji 64-bitowej:

  • Dla poszczególnych aplikacji można dodać <element useLegacyJit> do pliku konfiguracji aplikacji. Poniższe polecenie wyłącza kompilację przy użyciu nowego 64-bitowego kompilatora JIT, a zamiast tego używa starszego kompilatora JIT w wersji 64-bitowej.

    <?xml version ="1.0"?>  
    <configuration>  
        <runtime>  
           <useLegacyJit enabled="1" />  
        </runtime>  
    </configuration>  
    
  • Dla poszczególnych użytkowników można dodać REG_DWORD wartość o nazwie useLegacyJit do HKEY_CURRENT_USER\SOFTWARE\Microsoft\.NETFramework klucza rejestru. Wartość 1 umożliwia starsze 64-bitowe kompilator JIT; wartość 0 wyłącza ją i włącza nowy 64-bitowy kompilator JIT.

  • Dla poszczególnych maszyn można dodać REG_DWORD wartość o nazwie useLegacyJit do HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework klucza rejestru. Wartość 1 umożliwia starsze 64-bitowe kompilator JIT; wartość 0 wyłącza ją i włącza nowy 64-bitowy kompilator JIT.

Możesz również poinformować nas o problemie, zgłaszając usterkę w witrynie Microsoft Połączenie.

Zobacz też