Mitigação: Novo compilador JIT de 64 bits
A partir do .NET Framework 4.6, o tempo de execução inclui um novo compilador JIT de 64 bits para compilação just-in-time. Essa alteração não afeta a compilação com o compilador JIT de 32 bits.
Comportamento inesperado ou exceções
Em alguns casos, a compilação com o novo compilador JIT de 64 bits resulta em uma exceção de tempo de execução ou em um comportamento que não é observado ao executar código compilado pelo compilador JIT de 64 bits mais antigo. As diferenças conhecidas incluem o seguinte:
Importante
Todos esses problemas conhecidos foram resolvidos no novo compilador de 64 bits lançado com o .NET Framework 4.6.2. A maioria também foi abordada em versões de serviço do .NET Framework 4.6 e 4.6.1 incluídas no Windows Update. Você pode eliminar esses problemas garantindo que sua versão do Windows esteja atualizada ou atualizando para o .NET Framework 4.6.2.
Sob certas condições, uma operação de unboxing pode lançar compilações NullReferenceException de versão com a otimização ativada.
Em alguns casos, a execução do código de produção em um corpo de método grande pode lançar um StackOverflowExceptionarquivo .
Sob certas condições, as estruturas passadas para um método são tratadas como tipos de referência em vez de tipos de valor em compilações de versão. Uma das manifestações dessa questão é que os itens individuais de uma coleção aparecem em uma ordem inesperada.
Sob certas condições, a comparação de valores com seu conjunto de UInt16 bits altos é incorreta se a otimização estiver ativada.
Sob certas condições, particularmente ao inicializar valores de matriz, a inicialização da memória pela instrução IL pode inicializar a OpCodes.Initblk memória com um valor incorreto. Isso pode resultar em uma exceção não tratada ou saída incorreta.
Sob certas condições raras, um teste de bit condicional pode retornar o valor incorreto Boolean ou lançar uma exceção se as otimizações do compilador estiverem habilitadas.
Sob certas condições, se uma
if
instrução é usada para testar uma condição antes de entrar em umtry
bloco e na saída dotry
bloco, e a mesma condição é avaliada nocatch
bloco oufinally
, o novo compilador JIT de 64 bits remove a condição docatch
bloco oufinally
quando otimiza oif
código. Como resultado, o código dentro daif
instrução nocatch
bloco oufinally
é executado incondicionalmente.
Atenuação de problemas conhecidos
Se você encontrar os problemas listados acima, poderá resolvê-los seguindo um destes procedimentos:
Atualize para o .NET Framework 4.6.2. O novo compilador de 64 bits incluído no .NET Framework 4.6.2 resolve cada um desses problemas conhecidos.
Certifique-se de que a sua versão do Windows está atualizada executando o Windows Update. As atualizações de serviço para o .NET Framework 4.6 e 4.6.1 abordam cada um desses problemas, exceto o NullReferenceException em uma operação de unboxing.
Compile com o compilador JIT de 64 bits mais antigo. Consulte a seção Mitigação de outros problemas para obter mais informações sobre como fazer isso.
Atenuação de outros problemas
Se você encontrar qualquer outra diferença no comportamento entre o código compilado com o compilador JIT de 64 bits mais antigo e o novo compilador JIT de 64 bits, ou entre as versões de depuração e lançamento do seu aplicativo que são compiladas com o novo compilador JIT de 64 bits, você pode fazer o seguinte para compilar seu aplicativo com o compilador JIT de 64 bits mais antigo:
Por aplicativo, você pode adicionar o <elemento useLegacyJit> ao arquivo de configuração do aplicativo. O seguinte desativa a compilação com o novo compilador JIT de 64 bits e, em vez disso, usa o compilador JIT herdado de 64 bits.
<?xml version ="1.0"?> <configuration> <runtime> <useLegacyJit enabled="1" /> </runtime> </configuration>
Por usuário, você pode adicionar um
REG_DWORD
valor nomeadouseLegacyJit
àHKEY_CURRENT_USER\SOFTWARE\Microsoft\.NETFramework
chave do Registro. Um valor de 1 habilita o compilador JIT herdado de 64 bits; um valor de 0 o desativa e habilita o novo compilador JIT de 64 bits.Por máquina, você pode adicionar um
REG_DWORD
valor nomeadouseLegacyJit
àHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework
chave do Registro. Um valor de 1 habilita o compilador JIT herdado de 64 bits; um valor de 0 o desativa e habilita o novo compilador JIT de 64 bits.
Você também pode nos informar sobre o problema relatando um bug no Microsoft Connect.