Visual Studio: il problema della compatibilità nella creazione di app desktop

Visual Studio facilita lo sviluppo di applicazioni per diverse piattaforme e l'integrazione con Git consente una gestione semplice del codice. Il passaggio tra diverse versioni di .NET, tuttavia, richiede attenzione rispetto alla compatibilità delle applicazioni, soprattutto con le più recenti versioni unificate del framework.

In attesa del rilascio della versione successiva, al momento in cui scriviamo Visual Studio 2022 resta la release più aggiornata dell’ambiente di sviluppo integrato (o IDE) realizzato da Microsoft. Esistono più edizioni dell’IDE ma Visual Studio 2022 Community su conferma come una scelta eccellente per sviluppatori individuali, studenti e piccole organizzazioni.

Visual Studio Community è infatti disponibile gratis per singoli sviluppatori, per scopi educativi, di ricerca accademica e per contribuire a progetti open source. Ne è addirittura consentito l’uso commerciale: certamente da parte degli sviluppatori indipendenti ma anche nelle organizzazioni con meno di 250 PC o meno di 1 milione di dollari di fatturato annuo. In questo secondo caso, fino a 5 utenti possono usare Visual Studio Community. Nelle imprese di grandi dimensioni, l’uso di Visual Studio Community è consentito solo a sostegno della ricerca accademica, dell’insegnamento o per contribuire a progetti open source.

Visual Studio in breve: linguaggi supportati e funzionalità

Un IDE come Visual Studio supporta una vasta gamma di linguaggi di programmazione, tra cui C#, C++, Visual Basic, F#, JavaScript, TypeScript e Python. Gli sviluppatori possono così scegliere il linguaggio preferito o lavorare su diversi tipi di progetti, dalle applicazioni desktop a quelle Web e mobili.

Con Visual Studio è possibile cimentarsi con lo sviluppo di applicazioni multipiattaforma per Windows, macOS, Linux, iOS, Android, Web e cloud.

IntelliCode utilizza l’intelligenza artificiale per fornire suggerimenti contestuali durante la scrittura del codice, migliorando la produttività degli sviluppatori. Grazie all’integrazione con GitHub Copilot, inoltre, si possono ottenere suggerimenti contestuali durante la scrittura del codice: è addirittura possibile chiedere la stesura del codice da zero, semplicemente indicando che cosa si desidera ottenere usando il linguaggio naturale.

Visual Studio 2022 ha a suo tempo integrato strumenti avanzati per il debug, tra cui la possibilità di modificare il codice durante l’attività di debugging senza dover riavviare l’applicazione (hot reload), facilitando così lo sviluppo iterativo.

Infine, il supporto integrato per Git permette agli sviluppatori di gestire facilmente il versioning del codice direttamente dall’IDE.

L’installer di Visual Studio: punto di riferimento per scegliere i componenti software necessari

Dopo aver scaricato e avviato Visual Studio Community Edition, è possibile comporre il proprio ambiente di sviluppo ideale servendosi dell’apposito installer. Visual Studio Installer è sempre disponibile e può essere richiamato in qualunque momento dal menu Start di Windows, nel caso in cui si volessero aggiungere nuovi componenti o, viceversa, rimuovere quelli che non servono più. Se si fosse già installato e configurato Visual Studio, basta fare clic sul pulsante Modifica nella schermata principale dell’installer.

Nella scheda Carichi di lavoro, potete trovare tutto ciò di cui avete bisogno per realizzare ogni tipo di applicazione. Ricordate che se siete interessati a sviluppare programmi desktop, è necessario spuntare anche la casella del riquadro Sviluppo per desktop .NET. In questo modo potrete realizzare applicazioni Windows tradizionali dotate di una classica interfaccia utente.

Visual Studio Installer

Visual Studio e la compatibilità delle applicazioni: una questione cruciale

Abbiamo detto che Visual Studio supporta vari linguaggi di programmazione e integra un’ampia gamma di strumenti per la progettazione, il debugging e il deployment delle applicazioni. Tuttavia, l’eterogeneità delle piattaforme e delle versioni di .NET Framework, .NET Core e .NET 5/6/7/8 può rendere la garanzia della compatibilità delle applicazioni un compito difficile.

Ogni versione di .NET può comportare cambiamenti significativi nelle API (Application Programming Interface) e nel comportamento delle applicazioni. Gli sviluppatori devono prestare attenzione alle versioni specifiche con cui le loro applicazioni sono state create e testate.

Allo stesso modo, il rilascio di nuove versioni di Visual Studio e .NET può portare all’accantonamento e alla rimozione di alcune API. Questo può causare problemi di compatibilità per le applicazioni più vecchie. Gli sviluppatori devono essere proattivi nell’aggiornare il loro codice, in modo da scongiurare l’uso di funzionalità obsolete.

Quali versioni di .NET sono installate su un PC Windows

Per verificare quali versioni di .NET sono supportate nell’installazione di Windows in uso, si possono seguire alcuni semplici passaggi:

Innanzi tutto, premere Windows+R quindi digitare cmd per aprire una finestra del prompt dei comandi. Il comando seguente elenca tutti gli eventuali pacchetti SDK di .NET rilevati sul sistema:

dotnet --list-sdks

Ancora, con il comando che segue si possono scoprire i pacchetti di runtime .NET installati sulla macchina:

dotnet --list-runtimes

Differenze tra pacchetti .NET SDK e Runtime

I pacchetti .NET SDK (Software Development Kit) contengono un insieme di strumenti necessari per sviluppare, compilare, eseguire test e distribuire applicazioni .NET. Includono il compilatore, le librerie di sviluppo e gli strumenti che permettono di trasformare il codice sorgente in applicazioni eseguibili. Sono quindi software appannaggio degli sviluppatori.

.NET Runtime è invece l’ambiente in cui le applicazioni .NET sono eseguite. In questo caso, il pacchetto include solo le librerie necessarie per far girare un’applicazione compilata, senza la necessità degli strumenti di sviluppo.

Caratteristica .NET SDK .NET Runtime
Contenuto Strumenti di sviluppo, compilatori, CLI Librerie e motore per eseguire le applicazioni
Utilizzo Sviluppo di nuove applicazioni .NET Esecuzione di applicazioni già compilate
Scopo Sviluppare, compilare, testare Solo per l’esecuzione di applicazioni .NET
Dimensione Più grande, include tutti gli strumenti Più piccolo, contiene solo le librerie necessarie
Quando è necessario Sviluppo di software Esecuzione in ambienti di produzione

Tipi di pacchetti .NET Runtime

Quando in Windows si utilizza il comando dotnet --list-runtimes e si ottiene una lista più o meno nutrita di pacchetti runtime .NET, è importante comprendere le differenze tra i vari elementi elencati.

I pacchetti Microsoft.NETCore.App rappresentano il runtime di base per le applicazioni .NET Core. Forniscono le librerie e le funzionalità fondamentali necessarie per eseguire le applicazioni scritte in .NET Core. Sono runtime adatti applicazioni Web, servizi backend, console e applicazioni che non richiedono funzionalità desktop specifiche.

Viceversa, un pacchetto runtime come Microsoft.WindowsDesktop.App risulta specifico per le applicazioni desktop, in particolare per quelle sviluppate utilizzando WPF (Windows Presentation Foundation) e Windows Forms. Fornisce librerie e funzionalità necessarie per creare interfacce utente desktop su Windows. Il runtime è essenziale per le applicazioni che richiedono un’interfaccia grafica e le interazioni tipiche delle applicazioni desktop. Ancora, Microsoft.NETCore.App è orientato alle applicazioni server e console.

Microsoft.AspNetCore.App è un pacchetto runtime per le applicazioni ASP.NET Core. Include tutte le librerie necessarie per costruire applicazioni Web, API REST e applicazioni server-side. È progettato per semplificare lo sviluppo di applicazioni Web moderne ed è usato soprattutto nei progetti che richiedono funzionalità Web, come MVC (Model-View-Controller), Razor Pages, e SignalR.

Per lo sviluppo di Azure Functions, quindi ai fini della costruzione di applicazioni serverless, Microsoft.NET.Sdk.Functions è il runtime “ad hoc”. È progettato per semplificare il deployment e la gestione delle funzioni.

Ogni versione di .NET ha un ciclo di vita di supporto. Di solito ha senso concentrarsi sulle versioni LTS (Long-Term Support), che ricevono supporto per un periodo più lungo rispetto ad altre versioni. È importante pianificare le migrazioni e gli aggiornamenti in base alle scadenze del supporto Microsoft.

Differenza tra .NET Core e .NET

Il .NET Framework è la versione originaria di .NET, rilasciata da Microsoft nel 2002: una piattaforma proprietaria pensata principalmente per Windows senza alcun tipo di compatibilità nativa con Linux e macOS.

Le prime versioni del .NET Framework supportavano soltanto Windows Forms e WPF per le applicazioni desktop ed erano sfruttate solo per lo sviluppo di applicazioni desktop e Web, con ASP.NET.

Nel 2016, Microsoft ha presentato .NET Core come soluzione open source e multipiattaforma. Progettata per superare le limitazioni di .NET Framework, .NET Core offre maggiore flessibilità e supporto per sistemi operativi diversi (oltre a Windows, ci sono anche Linux e macOS). Proprio utilizzando .NET Core, abbiamo visto come creare un’applicazione funzionante senza Visual Studio.

ASP.NET Core si presenta inoltre come una versione aggiornata e più veloce di ASP.NET per lo sviluppo Web.

Nel 2020, Microsoft ha unificato le diverse versioni sotto un’unica piattaforma chiamata .NET (con .NET 5 come primo rilascio). L’iniziativa ha di fatto segnato l’unione di .NET Core e .NET Framework in una singola e moderna soluzione.

.NET combina il meglio di .NET Core e .NET Framework, mantiene la compatibilità con Windows, macOS e Linux, supporta lo sviluppo di applicazioni desktop tramite Windows Forms e WPF, integra il supporto nativo per le architetture ARM64.

Caratteristica .NET Core .NET (a partire da .NET 5)
Rilascio Iniziale 2016 2020
Multipiattaforma Sì (Windows, macOS, Linux) Sì (Windows, macOS, Linux)
Supporto per Windows Forms e WPF No (solo .NET Framework supportava pienamente) Sì (a partire da .NET 5)
Prestazioni Alte prestazioni, migliorate rispetto a .NET Framework Ottimizzate ulteriormente con nuove versioni
Modularità Modulare, librerie necessarie selezionabili Mantiene la modularità di .NET Core
Open Source
Evoluzione .NET Core sostituito da .NET 5 e versioni successive Versioni più moderne e unificate

Selezione del framework di destinazione in Visual Studio

Cliccando con il tasto destro sul nome del progetto nel riquadro Esplora soluzioni di Visual Studio quindi scegliendo Proprietà, attraverso la scheda Generale si ha la possibilità di scegliere il Framework di destinazione.

L’omonimo menu a tendina specifica la versione del framework o runtime .NET che l’applicazione in fase di sviluppo utilizzerà. Non tutte le versioni di .NET sono supportate su ogni sistema operativo o dispositivo.

Se si scegliesse una versione del framework non supportata sulla piattaforma di destinazione, l’applicazione non funzionerà correttamente. Ad esempio, se si sviluppa un’applicazione con .NET Framework 4.8, sarà eseguibile solo su Windows, mentre una con .NET 6, 7 o 8 sarà multipiattaforma (Windows, Linux, macOS).

Framework .NET destinazione

Molte librerie di terze parti e strumenti aggiornati restano compatibili solo con versioni più recenti di .NET. Scegliere un framework di destinazione troppo vecchio potrebbe limitare l’accesso a librerie moderne o richiedere versioni legacy delle stesse, che potrebbero non essere più mantenute dai rispettivi sviluppatori. Alcune dipendenze potrebbero inoltre non funzionare correttamente se la tua applicazione usa una versione del framework troppo nuova o troppo vecchia rispetto a quella supportata dalle librerie.

Dove trovare l’eseguibile compilato delle applicazioni sviluppate con Visual Studio

Scegliendo Release (anziché Debug) dal menu a tendina nella barra degli strumenti di Visual Studio quindi cliccando sul menu Compilazione, Compila soluzione, si ottiene una versione compilata dell’applicazione pronta per essere eseguita su qualunque dispositivo compatibile (vedi framework di destinazione selezionato in precedenza).

Impostazione framework destinazione Visual Studio

Cliccate con il tasto destro del mouse su una scheda del progetto quindi scegliete Apri cartella superiore: vi porterete così, in modo molto rapido, all’interno della cartella di riferimento del progetto Visual Studio.

File eseguibile compilato Visual Studio

Da qui, basta accedere alla directory Release, quindi cliccare due volte sulla cartella corrispondente al framework di destinazione. Qui troverete tutto il necessario da copiare sugli altri sistemi per eseguire il programma sviluppato con Visual Studio. Il file .pdb può essere ignorato perché contiene soltanto delle informazioni di debug.

Creare una versione indipendente di un eseguibile

Per creare un programma compilato con Visual Studio che funzioni indipendentemente dai pacchetti runtime .NET installati sui sistemi di destinazione, è possibile utilizzare lo strumento Pubblica.

Procedere in tal senso è molto semplice: basta fare clic sul nome del progetto nel riquadro Esplora soluzioni, scegliere Pubblica dal menu contestuale, selezionare Cartella dalla sezione Destinazione e ancora Cartella da Destinazione specifica. Come Percorso cartella, si può accettare quello proposto.

Creare un eseguibile self contained con Visual Studio

Con un clic su Mostra tutte le impostazioni, si deve scegliere la voce Completa nel menu a tendina Modalità di distribuzione, quindi il runtime di destinazione (ad esempio win-x64 per le versioni di Windows a 64 bit) e infine, da Opzioni di pubblicazione file, spuntare la casella Produci un singolo file.

Eseguibile unico con Visual Studio

Premendo Salva quindi Pubblica in alto a destra, si ottiene un unico file eseguibile che è molto più pesante rispetto a quello generato in precedenza ma che accoglie anche il framework di destinazione (che non dovrà essere installato manualmente sui singoli sistemi).

Il consiglio è comunque sempre quello di provare il funzionamento delle app sviluppate con Visual Studio sui vari sistemi operativi “target”: provate ad esempio a installare le varie versioni di Windows come macchine virtuali Hyper-V ed effettuate tutti i test.

L’esempio di Windows 7: funzionano .NET 6 e .NET 8

Per dare un’idea di quanto la piattaforma .NET risulta affidabile sul lungo periodo, basti pensare che le applicazioni sviluppate per .NET 6 o .NET 8, avvalendosi di macchine Windows 10 o Windows 11, funzionano senza problemi anche sui vecchi e non più supportati sistemi Windows 7.

.NET 6 sarà supportato da Microsoft fino al 12 novembre 2024 mentre il recente .NET 8 fino al 10 novembre 2026.

L’unica accortezza, nel caso di Windows 7, è installare tutte le patch disponibili su Windows Update (in caso di errore 80072efe scaricare e applicare manualmente l’aggiornamento KB3138612) per poi caricare i pacchetti .NET 6 o .NET 8.

Procedere quindi con l’installazione manuale di questo pacchetto universale e quindi della patch KB4019990 per i sistemi a 64 bit. Le moderne applicazioni .NET funzioneranno anche sulle vecchie macchine Windows 7.

L’immagine in apertura è tratta da Microsoft

Ti consigliamo anche

Link copiato negli appunti