Continua il nostro percorso nel mondo di C#, nell’articolo odierno vedremo come creare il nostro primo progetto.

Le attività che verranno proposte durante questo corso richiedono di aver installato almeno la versione 3.1 di .NET. Per controllare se nel nostro sistema è installato .NET possiamo aprire un prompt dei comandi e scrivere dotnet –info: questo comando fa visualizzare un elenco delle versioni di .NET attualmente presenti nel sistema, oppure può restituire un errore di comando sconosciuto per segnalare di non aver trovato nessuna versione di .NET installata. In questo caso, basterà collegarsi al sito di Microsoft per recuperare e installare la versione di .NET desiderata.

Un altro strumento su cui faremo affidamento è Visual Studio Code, un ambiente di sviluppo creato da Microsoft come progetto open source (quindi diverso dalla Community Edition di Visual Studio), insieme a due sue estensioni:

  • C# for Visual Studio Code che permetterà di lavorare in C#

  • Roslynator che è, invece, un analizzatore di codice. Questa è un’estensione opzionale che serve a segnalare se si sta scrivendo un codice non particolarmente ottimizzato: vengono infatti sottolineate le parti di codice che risultano non compliant (conformi) rispetto alle regole configurate in Roslynator stessa. Quest’estensione dà solamente dei suggerimenti, non è bloccante per la scrittura, compilazione ed esecuzione del codice.

Ora siamo pronti per affrontare il processo di creazione, modifica, compilazione ed esecuzione di un progetto C#. In ordine, ci occuperemo di:

  • creare un progetto C# (estensione .csproj)
  • editarlo tramite Visual Studio Code, cioè scriveremo del codice per eseguire alcune operazioni
  • attivare il processo di build, che utilizzerà il compilatore C# per trasformare il codice sorgente in linguaggio intermedio
  • eseguire il codice tramite compilazione JIT, che prenderà il linguaggio intermedio e lo trasformerà al volo in codice nativo, eseguibile dalla macchina

Per iniziare, utilizzeremo un programma molto recente di Microsoft incluso nell’SDK di .NET chiamato .NET CLI (command-line interface). Si tratta di un eseguibile avviabile da prompt dei comandi tramite il quale è possibile interagire con le API di .NET per fargli eseguire molte operazioni, incluse quelle necessarie per completare i passaggi che ci accingiamo a svolgere per la creazione del nostro primo progetto. Sulla documentazione ufficiale è possibile trovare tutti i dettagli relativi a queste e a molte altre operazioni che possono essere eseguite tramite riga di comando.

Come prima cosa, ci posizioniamo in una cartella a nostra scelta, apriamo un prompt dei comandi e creiamo una cartella che conterrà il nostro progetto (possiamo farlo eseguendo il comando md su Windows, oppure più comodamente tramite interfaccia grafica: per lo scopo del nostro progetto eseguiremo il comando md dotnet-esempi).

A questo punto, possiamo posizionarci con il prompt all’interno della cartella appena creata (comando cd su Windows) e scrivere il comando relativo alla creazione di un nuovo progetto, cioè dotnet new , sostituendo a il tipo di applicazione che vogliamo creare (nel nostro caso scriveremo console, perché il nostro progetto verrà avviato e consultato tramite riga di comando, ma si possono creare anche applicazioni touch o web, ad esempio).

A questo punto, possiamo notare che dentro la cartella sono comparsi alcuni file, tra i quali:

  • un file con estensione .csproj, che è il file principale del progetto, dove sono elencate tutte le sue proprietà di configurazione
  • un file chiamato Program.cs, che è il file che contiene il codice che compone il nostro progetto; automaticamente, il comando che abbiamo eseguito in precedenza ha inserito del codice necessario per il funzionamento di un programma del tipo console

Per modificare il file .cs possiamo ora avviare Visual Studio Code: procediamo sempre tramite prompt dei comandi e scriviamo il nome del programma (code), e la directory da utilizzare, in questo caso . (punto fermo, indica al programma di utilizzare la directory corrente). Visual Studio Code ci accoglierà con il messaggio di avviso “Required assets to build and debug are missing from ‘dotnet-esempi’. Add them?”, e dovremo rispondere Yes per attivare l’estensione OmniSharp, necessaria per metterci a disposizione le funzionalità di editing di C# (la sua attivazione viene confermata anche dalla comparsa di un’icona dedicata, in basso a sinistra).

Come per gli altri passaggi, possiamo aprire il file Program.cs anche nella maniera più comune a chi utilizza Windows, cioè tramite doppio click, e il risultato sarà lo stesso: si aprirà una finestra di Visual Studio Code che ci mostrerà il contenuto del nostro file, in questo caso le righe di codice necessarie per comporre un programma Hello World in C#. Questo programma costituisce solitamente lo step iniziale che ogni programmatore compie quando si accinge a studiare un nuovo linguaggio di programmazione, perché prevede di scrivere la stringa “Hello World” in output: è un passaggio semplice, senza interazioni con l’utente, ma che risulta esemplificativo per prendere confidenza con la sintassi e la struttura che deve implementare un programma in quello specifico linguaggio.

Ora possiamo finalmente procedere con il processo di build, o compilazione, del programma, cioè la fase che prende il codice sorgente e lo trasforma in intermediate language, solitamente sotto forma di file .dll (dynamic-link library): questo è un formato binario diventato ormai standard di Windows (esiste infatti da Windows 3.1), nato per contenere librerie software, cioè insiemi di funzionalità. Se navigassimo infatti all’interno della directory Windows del nostro PC, magari esplorando la sottodirectory System32, potremmo trovare un gran numero di librerie, necessarie per implementare le funzionalità del nostro sistema operativo, e allo stesso modo la compilazione del nostro programma generà una libreria che esporrà le funzionalità ad esso necessarie. Per generare questa libreria, possiamo procedere sempre tramite il prompt dei comandi utilizzato in precedenza, oppure utilizzare quello perfettamente equivalente fornito da Visual Studio Code (se non è visibile in basso nel nostro programma, possiamo aprirlo tramite il menù in alto Terminal à New Terminal), e scrivere il comando dotnet build. Il processo richiederà pochi secondi, perché il nostro progetto è particolarmente piccolo, e potremo visualizzarne l’andamento e l’esito sempre nel lato inferiore di Visual Studio Code: se leggeremo Build Succeeded avrà avuto successo, altrimenti potremo vedere una lista di errori e warning che ne hanno impedito il completamento.

Se il processo di build terminerà con successo, potremo trovare nella cartella del progetto sia la libreria .dll che un file eseguibile per Windows, con estensione .exe: questo ci permetterà di eseguire il nostro programma, o scrivendone il nome nel prompt dei comandi oppure utilizzando il comando dotnet run. Se proviamo a lanciarlo, vedremo che sulla console verrà scritta la stringa “Hello World”: questo risultato all’apparenza semplice dimostra come la macchina ci nasconda diversi livelli di complessità, perché all’atto pratico questa andrà, in sequenza, a leggere l’intermediate language, lo interpreterà ed eseguirà infine, tramite una macchina virtuale, i passaggi in esso descritti.

L’ultimo comando su cui poniamo attenzione in questa lezione è quello necessario per aggiungere dipendenze esterne, quindi librerie, al nostro progetto. È un passaggio fondamentale perché nella nostra carriera da sviluppatori faremo costantemente affidamento su librerie scritte da altri per utilizzare funzionalità che sono a noi necessarie, ma che richiederebbero troppo tempo per essere implementate da zero. In .NET le librerie si trovano solitamente sul sito nuget.org (il sito è navigabile, in modo da poter ricercare senza grosse difficoltà ciò che ci serve), e possono essere scaricate e aggiunte al nostro progetto eseguendo semplicemente il comando dotnet add package <NOME DEL PACKAGE>: dietro le quinte verrà contattato il sito, verranno scaricati i file necessari e infine verrà aggiunta una riga al file .csproj citato in precedenza, in cui si indica che il nostro progetto avrà una nuova dipendenza (farà cioè affidamento su questo pacchetto di librerie, necessario per l’esecuzione del programma).

Il materiale è tratto dalle lezioni IPID svolte da Marco Pirruccio di Heartwood Labs/Operaludica.