Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
A partir do .NET Framework 4.6, o runtime 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 uma exceção NullReferenceException em compilações de Release com a otimização ativada.
Em alguns casos, a execução do código de produção num corpo de método grande pode lançar um StackOverflowException.
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
ifdeclaração é usada para testar uma condição antes de entrar em umtrybloco e na saída de umtrybloco, e a mesma condição é avaliada nocatchbloco oufinallybloco, o novo compilador JIT de 64 bits remove a condição doifbloco ou nocatchbloco quando otimiza ofinallycódigo. Como resultado, o código dentro da instruçãoifno blococatchoufinallyé 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 numa 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_DWORDvalor nomeadouseLegacyJitàHKEY_CURRENT_USER\SOFTWARE\Microsoft\.NETFrameworkchave 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.Para cada máquina, pode-se adicionar um
REG_DWORDvalor nomeadouseLegacyJitnaHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFrameworkchave 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.