La scadenza che riguarda milioni di applicazioni
Il 10 novembre 2026 è una data che ogni sviluppatore .NET dovrebbe segnare in calendario. In quel giorno, coincidente con il Patch Tuesday di novembre, sia .NET 8 che .NET 9 raggiungeranno la fine del supporto ufficiale Microsoft. Nessun aggiornamento di sicurezza, nessuna correzione di bug, nessun supporto tecnico. Le applicazioni continueranno a funzionare, ma rimarranno permanentemente esposte a qualsiasi vulnerabilità scoperta dopo quella data.
La cosa insolita di questa scadenza è che riguarda contemporaneamente due versioni: .NET 8 (LTS) e .NET 9 (STS). Normalmente un release LTS ha un ciclo di vita più lungo, ma in questo caso il calendario ha fatto sì che le loro finestre di supporto si chiudano lo stesso giorno. Chi è su .NET 9 sperando di guadagnare tempo rispetto a .NET 8 rimarrà deluso: la scadenza è identica.
Cosa succede dopo la fine del supporto
Le applicazioni basate su .NET 8 o .NET 9 continueranno a girare normalmente il giorno dopo la scadenza. Il problema non è l’esecuzione, è il rischio accumulato nel tempo:
- Nessuna patch di sicurezza per vulnerabilità future nel runtime o nelle librerie base.
- Visual Studio 2022 inizierà a segnalare i componenti .NET 8 e .NET 9 come “fuori supporto” in un aggiornamento futuro.
- Problemi di compliance per applicazioni in ambienti regolamentati (finanziario, sanitario, PA) che richiedono software aggiornato.
- Dipendenze di terze parti che smettono di supportare le versioni EOL, creando colli di bottiglia nelle pipeline di aggiornamento.
Il rischio non è immediato ma cresce nel tempo. Ogni mese trascorso su un runtime non supportato è un mese in cui una CVE critica potrebbe restare irrisolta.
Perché migrare direttamente a .NET 10 LTS
.NET 10 è il target di migrazione raccomandato. È la versione LTS corrente, rilasciata a novembre 2025 e supportata fino al novembre 2028: tre anni di aggiornamenti garantiti. Non ha senso fermarsi a .NET 9, che ha la stessa data di scadenza di .NET 8: sarebbe aggiungere lavoro di migrazione senza estendere la finestra di supporto.
.NET 10 porta miglioramenti significativi in diverse aree:
- Performance: ulteriori ottimizzazioni al JIT, riduzione delle allocazioni in Span e Memory, miglioramenti a LINQ e collezioni.
- ASP.NET Core: nuove API per minimal API, miglioramenti a Blazor, OpenAPI nativo senza dipendenze esterne.
- C# 14: field keyword per le proprietà auto, extension members, parametri params su ReadOnlySpan.
- Tooling: .NET Aspire 9 integrato, nuove funzionalità in dotnet publish per container nativi.
Come migrare: i passi pratici
1. Aggiornare il TargetFramework
Il primo passo è aggiornare il file di progetto .csproj. La modifica è minimale:
<!-- Prima -->
<TargetFramework>net8.0</TargetFramework>
<!-- Dopo -->
<TargetFramework>net10.0</TargetFramework>
Per progetti multi-target:
<TargetFrameworks>net10.0;net8.0</TargetFrameworks>
2. Aggiornare i pacchetti NuGet
Verificare che tutti i pacchetti Microsoft.* siano aggiornati alla versione compatibile con .NET 10. Usare dotnet outdated (strumento separato) o il Package Manager di Visual Studio per identificare i pacchetti da aggiornare.
dotnet list package --outdated
3. Usare il .NET Upgrade Assistant
Per progetti complessi o soluzioni con più progetti, Microsoft fornisce il .NET Upgrade Assistant, disponibile come tool CLI e come estensione Visual Studio:
dotnet tool install -g upgrade-assistant
upgrade-assistant upgrade MyProject.csproj
L’Upgrade Assistant analizza il progetto, identifica API deprecate, suggerisce sostituzioni e può applicare alcune modifiche automaticamente. Non risolve tutto, ma riduce significativamente il lavoro manuale.
4. Verificare le dipendenze di terze parti
Questo è spesso il collo di bottiglia più sottovalutato. Librerie NuGet che non hanno ancora rilasciato una versione compatibile con .NET 10 possono bloccare la migrazione. Controllare GitHub e NuGet Gallery per verificare lo stato di supporto di ogni dipendenza critica. Se un vendor non ha ancora aggiornato, contattarlo subito: con cinque mesi alla scadenza, i tempi di risposta si stringeranno progressivamente.
5. Testare prima del rollout
Per applicazioni con buona copertura di test, la migrazione da .NET 8 a .NET 10 è generalmente lineare. Breaking changes tra versioni LTS sono limitati e ben documentati nelle note di rilascio. Microsoft pubblica la lista completa su GitHub nel repository dotnet/core. Il time-to-complete dipende dalla complessità: da una a tre settimane per un singolo servizio con buon test coverage, quattro-otto settimane per piattaforme multi-servizio con audit delle dipendenze e rollout graduale.
Timeline consigliata
Con la scadenza al 10 novembre 2026, luglio e agosto sono il momento ideale per avviare la pianificazione. Aspettare settembre o ottobre significa sovrapporsi con i freeze di fine anno e ridurre drasticamente il margine di sicurezza per gestire problemi imprevisti.
Un approccio ragionevole:
- Luglio 2026: inventario delle applicazioni su .NET 8/9, audit delle dipendenze NuGet, verifica compatibilità vendor.
- Agosto 2026: migrazione dei progetti interni meno critici, test in ambiente staging.
- Settembre-Ottobre 2026: migrazione dei sistemi critici, test di regressione, formazione del team sulle novità .NET 10.
- Novembre 2026: deploy in produzione con ampio margine prima della scadenza.
Conclusione
La doppia scadenza di .NET 8 e .NET 9 il 10 novembre 2026 è un’opportunità per consolidare il proprio stack su .NET 10 LTS, garantendo tre anni di supporto garantito e beneficiando delle ottimizzazioni di performance dell’ultimo runtime. La migrazione è tecnicamente accessibile, ma richiede pianificazione anticipata, soprattutto per gestire le dipendenze di terze parti. Iniziare ora, prima che la finestra si restringa, è la mossa giusta.
Fonti: Microsoft aligns .NET 8 and .NET 9 end of support for November 2026 – 4sysops · Official .NET Support Policy – Microsoft