Compatibilità delle applicazioni in .NET Framework
La compatibilità è un obiettivo importante di ogni versione di .NET Framework. La compatibilità garantisce che ogni versione offra funzionalità aggiuntive rispetto alle precedenti, che pertanto continueranno a funzionare. D'altra parte, quando codice o applicazioni esistenti vengono eseguiti in una versione successiva, le modifiche apportate alle funzionalità precedenti (ad esempio, per migliorare le prestazioni, risolvere i problemi di sicurezza o correggere i bug) possono causare problemi di compatibilità.
Ogni app viene destinata a una versione specifica di .NET Framework tramite:
- Definizione di un framework di destinazione in Visual Studio.
- Indicazione del framework di destinazione in un file di progetto.
- Applicazione di un TargetFrameworkAttribute al codice sorgente.
Quando si esegue la migrazione da una versione di .NET Framework a un'altra, esistono due tipi di modifiche da considerare:
Modifiche in fase di esecuzione
I problemi di runtime sono quelli che si verificano quando un nuovo runtime viene inserito in un computer e cambia il comportamento di un'app. Durante l'esecuzione in una versione più recente di quella di destinazione, .NET Framework simula la versione di destinazione precedente adottando un comportamento anomalo. L'app viene eseguita nella versione più recente, ma funziona come se fosse in esecuzione nella versione precedente. Questo modello di comportamento consente di mitigare molti problemi di compatibilità tra versioni diverse di .NET Framework. Ad esempio, se un file binario è stato compilato per .NET Framework 4.0 ma viene eseguito in un computer con .NET Framework 4.5 o versione successiva, viene eseguito in modalità compatibilità .NET Framework 4.0. Ciò significa che molte delle modifiche nella versione successiva non influiscono sul file binario.
La versione di .NET Framework a cui è destinata un'applicazione è determinata dalla versione di destinazione dell'assembly di ingresso per il dominio dell'applicazione in cui viene eseguito il codice. Tutti gli assembly aggiuntivi caricati in quel dominio dell'applicazione sono destinati a tale versione. Nel caso di un file eseguibile, ad esempio, la versione a cui è destinato l'eseguibile corrisponde alla modalità di compatibilità in cui vengono eseguiti tutti gli assembly in quel dominio dell'applicazione.
Modifiche di reindirizzamento
Le modifiche di ridestinazione sono quelle che si verificano quando un assembly viene ricompilato per impostare come destinazione una versione più recente. Impostare come destinazione una versione più recente significa che l'assembly acconsente esplicitamente all'uso delle nuove funzionalità, così come a potenziali problemi di compatibilità con le funzionalità precedenti.
Classificazione dell'impatto
Negli articoli che descrivono le modifiche di runtime e ridestinazione, ad esempio, Modifiche di ridestinazione per la migrazione a .NET Framework 4.8.x, i singoli elementi vengono classificati in base all'impatto previsto come indicato di seguito:
Major
Una modifica significativa che influisce su un numero elevato di app o che richiede variazioni sostanziali del codice.
Minor
Una modifica che influisce su un numero ridotto di app o che richiede variazioni marginali del codice.
Caso limite
Una modifica che influisce sulle app in scenari molto specifici e non comuni.
Trasparente
Una modifica che non ha effetti evidenti sullo sviluppatore o sull'utente dell'app. L'app non dovrebbe richiedere variazioni a causa di questa modifica.