Ś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 wprowadzeniemtry
bloku i wyjścia ztry
bloku, a ten sam warunek jest obliczany wcatch
bloku lubfinally
, nowy kompilator 64-bitowy JIT usuwaif
warunek zcatch
bloku lubfinally
podczas optymalizowania kodu. W rezultacie kod wewnątrz instrukcjiif
wcatch
bloku orfinally
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 nazwieuseLegacyJit
doHKEY_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 nazwieuseLegacyJit
doHKEY_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.