Partilhar via


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 um try bloco e na saída do try bloco, e a mesma condição é avaliada no catch bloco oufinally, o novo compilador JIT de 64 bits remove a condição do catch bloco ou finally quando otimiza o if código. Como resultado, o código dentro da if instrução no catch bloco ou finally é 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 nomeado useLegacyJit à 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 nomeado useLegacyJit à 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.

Consulte também