Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
A partire da .NET Framework 4.6, il runtime include un nuovo compilatore JIT a 64 bit per la compilazione just-in-time. Questa modifica non influisce sulla compilazione con il compilatore JIT a 32 bit.
Comportamento o eccezioni impreviste
In alcuni casi, la compilazione con il nuovo compilatore JIT a 64 bit genera un'eccezione di runtime o un comportamento non osservato durante l'esecuzione di codice compilato dal compilatore JIT a 64 bit precedente. Le differenze note includono quanto segue:
Importante
Tutti questi problemi noti sono stati risolti nel nuovo compilatore a 64 bit rilasciato con .NET Framework 4.6.2. La maggior parte è stata risolta anche nelle versioni di servizio di .NET Framework 4.6 e 4.6.1 incluse in Windows Update. È possibile eliminare questi problemi assicurandosi che la versione di Windows sia aggiornata o eseguendo l'aggiornamento a .NET Framework 4.6.2.
In determinate condizioni, un'operazione di conversione unboxing può generare NullReferenceException nelle build di rilascio con l'ottimizzazione attivata.
In alcuni casi l'esecuzione del codice di produzione in un corpo del metodo di grandi dimensioni può generare StackOverflowException.
In determinate condizioni, le strutture passate a un metodo vengono considerate come tipi di riferimento anziché tipi valore nelle build release. Una delle manifestazioni di questo problema è che i singoli elementi in una raccolta vengono visualizzati in un ordine imprevisto.
In determinate condizioni, il confronto dei valori di UInt16 con il set di bit elevato non è corretto se l'ottimizzazione è abilitata.
In determinate condizioni, in particolare durante l'inizializzazione dei valori della matrice, è possibile che l'inizializzazione della memoria con l'istruzione IL OpCodes.Initblk venga eseguita con un valore non corretto. Ciò può generare un'eccezione non gestita o un output non corretto.
In alcuni casi rari, un test condizionale dei bit può restituire il valore Boolean non corretto o generare un'eccezione se sono abilitate le ottimizzazioni del compilatore.
In determinate condizioni, se un'istruzione
if
viene usata per testare una condizione prima di immettere un bloccotry
e in uscita dal bloccotry
, e la stessa condizione viene valutata nel bloccocatch
ofinally
, il nuovo compilatore JIT a 64 bit rimuove la condizioneif
dal bloccocatch
ofinally
quando ottimizza il codice. Di conseguenza, il codice contenuto nell'istruzioneif
nel bloccocatch
ofinally
viene eseguita in modo non condizionale.
Mitigazione dei problemi noti
Se si verificano i problemi elencati in precedenza, è possibile risolverli effettuando una delle operazioni seguenti:
Eseguire l'aggiornamento a .NET Framework 4.6.2. Il nuovo compilatore a 64 bit incluso in .NET Framework 4.6.2 risolve tutti questi problemi noti.
Assicurarsi che la versione di Windows venga aggiornata tramite l'esecuzione di Windows Update. Gli aggiornamenti dei servizi per .NET Framework 4.6 e 4.6.1 risolvono tutti questi problemi, ad eccezione di NullReferenceException in un'operazione di conversione unboxing.
Eseguire la compilazione con la versione precedente del compilatore JIT a 64 bit. Vedere la sezione Mitigazione di altri problemi per altre informazioni su come eseguire questa operazione.
Mitigazione di altri problemi
Nel caso di qualsiasi altra differenza nel comportamento tra il codice compilato con la versione precedente del compilatore a 64 bit e quello compilato con la versione nuova, oppure tra le versioni di debug e rilascio dell'app compilate entrambe con il nuovo compilatore JIT a 64 bit, è possibile eseguire le operazioni seguenti per compilare l'app con la versione precedente del compilatore JIT a 64 bit:
Per ogni applicazione, è possibile aggiungere l'elemento <useLegacyJit> al file di configurazione dell'applicazione. Le operazioni seguenti consentono di disattivare la compilazione con il nuovo compilatore JIT a 64 bit e usare invece il compilatore JIT a 64 bit legacy.
<?xml version ="1.0"?> <configuration> <runtime> <useLegacyJit enabled="1" /> </runtime> </configuration>
Per ogni utente è possibile aggiungere un valore
REG_DWORD
denominatouseLegacyJit
per la chiaveHKEY_CURRENT_USER\SOFTWARE\Microsoft\.NETFramework
del Registro di sistema. Il valore 1 abilita il compilatore JIT a 64 bit legacy, mentre il valore 0 lo disattiva e consente di abilitare il nuovo compilatore JIT a 64 bit.Per ogni macchina è possibile aggiungere un valore
REG_DWORD
denominatouseLegacyJit
per la chiaveHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework
del Registro di sistema. Il valore 1 abilita il compilatore JIT a 64 bit legacy, mentre il valore 0 lo disattiva e consente di abilitare il nuovo compilatore JIT a 64 bit.
È possibile inoltre inviare i dettagli sul problema segnalando un bug in Microsoft Connect.