C’era una volta il .NET Framework, un pacchetto creato da Microsoft e progettato per facilitare la creazione e l’esecuzione di applicazioni Windows. Nato nel 2002, lo strumento è rapidamente divenuto un componente essenziale per gli sviluppatori che desiderano costruire applicazioni robuste, scalabili e sicure. Prima di .NET Framework gli sviluppatori avvezzi a usare le soluzioni Microsoft, si appoggiavano direttamente alle API Win32, ossia all’interfaccia di programmazione principale per le applicazioni Windows, all’architettura COM (Component Object Model), alla piattaforma Windows DNA per la creazione di applicazioni client-server, a Visual Basic (all’epoca non implementava completamente la programmazione a oggetti), a J++ e così via.
Oggi si parla ancora di .NET Framework ma ancora di più, genericamente, di .NET. Cosa significa e quali sono le differenze tra le due piattaforme?
Cos’è .NET Framework e da cosa è composto
Il .NET Framework è un pacchetto composto da diverse parti fondamentali. Il cuore del framework, CLR (Common Language Runtime), gestisce l’esecuzione delle applicazioni, fornendo servizi come la gestione della memoria, la gestione delle eccezioni e la sicurezza. Grazie al CLR, gli sviluppatori possono scrivere codice in diversi linguaggi (come C#, VB.NET e F#), avendo poi la certezza che possa essere eseguito correttamente.
Un’ampia raccolta di classi, interfacce e API semplificano la programmazione. Le librerie forniscono funzionalità comuni, come l’accesso ai file, la gestione delle stringhe, la manipolazione dei dati e la comunicazione di rete, consentendo agli sviluppatori di ridurre il tempo di sviluppo e aumentare la produttività. Non c’è più bisogno di padroneggiare l’utilizzo delle API Win32 (ricordiamo di aver ancora da qualche parte un tomo da oltre 1.000 pagine con la spiegazione di ogni singola API utilizzabile in Windows…) perché tutto il necessario è contenuto nel .NET Framework.
Una parte del framework, ASP.NET, è specificamente progettata per lo sviluppo di applicazioni Web. Con ASP.NET si possono creare siti Web dinamici e applicazioni Web, supportando gran parte delle tecnologie più moderne.
Altri componenti del .NET sono Windows Presentation Foundation (WPF), un framework per la creazione di interfacce utente per applicazioni desktop. WPF consente di costruire applicazioni grafiche avanzate e ricche di contenuti, utilizzando XAML per definire l’interfaccia utente. Windows Communication Foundation (WCF) è la piattaforma per costruire servizi e applicazioni distribuiti che possono comunicare tra loro attraverso vari protocolli. Infine, l’Entity Framework semplifica l’interazione con i database, consentendo agli sviluppatori di lavorare con i dati utilizzando oggetti C# anziché scrivere codice SQL.
Le principali limitazioni del .NET Framework
Chiariamolo subito. Il .NET Framework non è andato in pensione. Anzi, Microsoft lo supporta attivamente ancora oggi. Il vecchio .NET Framework 3.5 SP1, rilasciato a novembre 2008, sarà accantonato a gennaio 2029. Per le versioni 4.6.2, 4.7.x e 4.8.x, Microsoft non ha nemmeno indicato una data di fine supporto.
La principale limitazione di .NET Framework è che le applicazioni basate su questa piattaforma possono funzionare solo su Windows. Non sono compatibili con altri sistemi e non si possono quindi creare progetti multipiattaforma.
Dal punto di vista tecnico, anche se il CLR gestisce la memoria tramite garbage collection, gli sviluppatori non hanno il controllo diretto sulla gestione della memoria. Inoltre, le nuove versioni del .NET Framework non sono sempre completamente retrocompatibili. Così, gli sviluppatori possono affrontare difficoltà nella migrazione delle applicazioni esistenti verso versioni più recenti. Ciò è dovuto alle modifiche sul comportamento delle API o delle singole funzionalità.
Sebbene il .NET Framework supporti molte tecnologie moderne, alcune nuove funzionalità e architetture, come i microservizi e le applicazioni basate su container non risultano supportate in modo adeguato.
La pagina di download di .NET Framework permette di scaricare tutte le versioni ad oggi disponibili.
Il passaggio da .NET Framework a .NET Core
Fino al 2016, anno di rilascio di .NET Core, il pacchetto .NET Framework era di fatto la prima scelta per chi sceglieva di programmare in Windows con le tecnologie Microsoft.
.NET Core nasce come soluzione open source e multipiattaforma, per superare le limitazioni di .NET Framework. Lo strumento è progettato per consentire agli sviluppatori di creare e distribuire applicazioni su Windows, macOS e Linux. In un altro nostro articolo abbiamo visto come creare un’applicazione funzionante senza Visual Studio con .NET Core.
La piattaforma .NET Core è costruita su un’architettura modulare, consentendo agli sviluppatori di includere solo i pacchetti e le dipendenze necessari per le loro applicazioni. Da un lato si ottiene un’ottimizzazione delle prestazioni, dall’altro la riduzione delle dimensioni delle applicazioni. Questa spinta è determinata proprio dall’esigenza di migliorare le performance nell’ambito dei microservizi e delle architetture basate su container.
Diventa così molto più facile la creazione di applicazioni distribuite e scalabili che possono essere eseguite in ambienti cloud.
Con l’introduzione di .NET Core, Microsoft ha integrato il supporto per tecnologie moderne come ASP.NET Core, Entity Framework Core, e nuovi modelli di sviluppo come Razor Pages e Blazor.
La migrazione a .NET: cosa è cambiato per sviluppatori e utenti
Il passaggio da .NET Framework a .NET, ufficialmente avvenuto con il rilascio di .NET 5 il 10 novembre 2020, ha segnato un’importante evoluzione nella piattaforma di sviluppo di Microsoft.
La transizione non è un semplice aggiornamento di versione, ma una vera e propria trasformazione della filosofia alla base del framework di sviluppo, mirata a rispondere alle esigenze emergenti del mercato tecnologico e dei programmatori.
Fino a fine 2020, infatti, gli sviluppatori si trovavano dinanzi a un panorama molto frammentato: .NET Framework, .NET Core e Xamarin (piattaforma di sviluppo software per applicazioni mobili cross-platform, che consente agli sviluppatori di scrivere codice in C# e di condividerlo tra diverse piattaforme, come Android, iOS e Windows) operavano in contesti separati.
Con .NET 5, gli sviluppatori hanno avuto finalmente la possibilità di scrivere codice “one fits all” ovvero di realizzare applicazioni in grado di funzionare allo stesso modo, indipendentemente dalla piattaforma sulla quale erano eseguite: desktop, server, mobile o cloud; Windows, Linux, macOS, Android o iOS.
Sul piano delle prestazioni, i miglioramenti nella gestione della memoria e nel throughput delle applicazioni si traducono in esperienze più fluide per gli utenti finali. Che possono beneficiare di “vantaggi velocistici” concreti rispetto ai precedenti .NET Framework e .NET Core.
L’aspetto della modularità in .NET: un passo in avanti fondamentale
Mentre .NET Framework era e rimane di fatto un “pacchetto monolitico” da installare nella sua interezza per far funzionare le applicazioni, .NET usa un innovativo approccio modulare.
Gli sviluppatori sono liberi di includere solo le librerie e i pacchetti necessari per le loro applicazioni, riducendo la dimensione dei programmi e snellendo la gestione delle dipendenze software. Lo stesso orientamento verso la modularità, si ritrova anche in Visual Studio, il cui installer permette di installare e gestire solo i componenti che servono a ciascun sviluppatore, ignorando tutti gli altri. Che diversamente rimarrebbero del tutto inutilizzati.
.NET rappresenta inoltre la conferma dell’impegno di Microsoft sul versante open source: aprire la piattaforma al contributo della comunità ha permesso di spingere l’acceleratore sull’innovazione, accrescendo parimenti affidabilità e sicurezza della piattaforma. L’approccio aperto fa sì come una comunità globale di sviluppatori possa cooperare per migliorare continuamente .NET.
Tutte le versioni di .NET sono scaricabili dal sito ufficiale: .NET 5 e .NET 7 sono già state ritirate, essendo giunte alla data prestabilita di fine supporto. In generale, da sviluppatori, è sempre bene orientarsi sulle release LTS (Long Term Support) che godono di un supporto almeno decennale.
Come verificare se un’applicazione Windows necessita di una versione di .NET Framework, di .NET Core o di .NET ?
Ovviamente tutto parte dalla documentazione dell’applicazione: gli sviluppatori generalmente indicano i requisiti di sistema, comprese le versioni di .NET necessarie.
Durante l’installazione, inoltre, molte applicazioni verificano automaticamente la presenza delle versioni necessarie di .NET Framework, .NET Core o .NET. Se non trovano la versione richiesta, la routine di installazione può scaricarla o visualizzare un messaggio d’errore indicando il pacchetto mancante.
Con Visual Studio è possibile creare creare applicazioni compilate che “si reggono da sole”, senza necessitare della presenza di una specifica versione di .NET. Si chiamano applicazioni self-contained (autonome): il nome suggerisce che il pacchetto distribuito dallo sviluppatore contiene tutto il necessario per l’esecuzione, compreso il runtime .NET.
Ovviamente, poiché includono il runtime e tutte le dipendenze necessarie, queste applicazioni tendono ad avere dimensioni maggiori rispetto alle loro controparti che poggiano sulla presenza di un pacchetto .NET già presente sul sistema in uso.
Accedere alle proprietà del file eseguibile
Alcune applicazioni includono informazioni sui requisiti .NET nelle proprietà del file eseguibile (.exe
).
Suggeriamo quindi di cliccare con il tasto destro sull’eseguibile del programma, selezionare la voce Proprietà dal menu contestuale, cliccare sulla scheda Dettagli quindi cercare la presenza di eventuali riferimenti a .NET Framework o versioni specifiche.
Verificare le dipendenze
Nel caso delle applicazioni .NET Core o .NET, si può controllare il contenuto dei .csproj
o appsettings.json
per vedere le dipendenze specificate.
Tra le varie righe presenti, si dovrebbe andare alla ricerca della linea che specifica il framework target, ad esempio:
<TargetFramework>net5.0</TargetFramework>
In alternativa, si può trovare qualcosa di simile:
"frameworks": {
"netcoreapp3.1": { ... }
}
Quanto riportato si commenta da solo e fornisce una conferma delle versioni di .NET o di .NET Core che risultano necessarie.
Usare un decompilatore
Strumenti di terze parti, chiamati decompilatori, permettono di “smontare” un eseguibile convertendone il codice macchina in un sorgente di alto livello. Nel caso delle applicazioni .NET, l’obiettivo è ricostruire le istruzioni nel linguaggio di programmazione usato per sviluppare il programma.
Tra i migliori decompiler per .NET ci sono strumenti come dotPeek e ILSpy: in entrambi i casi le applicazioni indicano quali versioni di .NET sono richieste. Oltre evidentemente a portare a galla i segreti del funzionamento di ogni singola applicazione.
Credit immagine in apertura: Microsoft.