Panoramica di CLR (Common Language Runtime)

In .NET è disponibile un ambiente di runtime denominato Common Language Runtime (CLR), in cui viene eseguito il codice e nel quale sono offerti servizi che facilitano il processo di sviluppo.

I compilatori e gli strumenti dei linguaggi espongono le funzionalità di CLR e consentono di scrivere codice che sfrutta i vantaggi di questo ambiente di esecuzione gestito. Il codice sviluppato tramite un compilatore di linguaggio destinato a CLR viene definito codice gestito. Il codice gestito beneficia di funzionalità quali l'integrazione tra i linguaggi, la gestione delle eccezioni in linguaggi diversi, la sicurezza avanzata, il supporto per il controllo delle versioni e la distribuzione, un modello semplificato per l'interazione tra componenti e servizi di debug e di profilatura.

Nota

I compilatori e gli strumenti possono produrre un output che può essere usato da CLR perché il sistema di tipi, il formato dei metadati e l'ambiente di runtime (il sistema di esecuzione virtuale) sono tutti definiti da uno standard pubblico, la specifica Common Language Infrastructure di ECMA. Per altre informazioni, vedere ECMA C# and Common Language Infrastructure Standards (Specifiche ECMA C# e Common Language Infrastructure).

Per consentire all'ambiente di esecuzione di fornire servizi al codice gestito, è necessario che i compilatori di linguaggio generino metadati che descrivono i tipi, i membri e i riferimenti presenti nel codice. I metadati sono memorizzati con il codice: ogni file eseguibile trasportabile (PE, Portable Executable) caricabile in Common Language Runtime contiene metadati. I metadati vengono usati nell'ambiente di esecuzione per individuare e caricare classi, disporre istanze in memoria, risolvere chiamate di metodo, generare codice nativo, garantire sicurezza e impostare limiti di contesto per la fase di esecuzione.

Il runtime gestisce automaticamente il layout degli oggetti e i riferimenti agli oggetti; quando non sono più in uso, gli oggetti vengono rilasciati. Gli oggetti la cui durata viene amministrata con queste modalità vengono denominati dati gestiti. La procedura di Garbage Collection consente di eliminare il rischio di perdita di memoria e di altri errori comuni di programmazione. Se si impiega codice gestito, è possibile usare nell'applicazione .NET sia dati gestiti che dati non gestiti, anche simultaneamente. Dal momento che i compilatori di linguaggio forniscono i propri tipi, ad esempio i tipi primitivi, è possibile che non sempre lo sviluppatore sappia, o abbia l'esigenza di sapere, se i dati che usa sono gestiti.

Common Language Runtime facilita la progettazione di componenti e applicazioni i cui oggetti interagiscano in contesti di linguaggi diversi. Oggetti scritti in linguaggi differenti possono infatti interagire e funzionare in modo strettamente integrato. Una volta definita una classe, ad esempio, è possibile usare un linguaggio differente per derivarne un'altra classe o per chiamarvi un metodo. È anche possibile passare l'istanza di una classe al metodo di una classe scritta in un linguaggio differente. Questa integrazione tra linguaggi è possibile perché i compilatori e gli strumenti dei linguaggi destinati al runtime usano un sistema di tipi comune definito dal runtime. Seguono le regole del runtime per la definizione di nuovi tipi, oltre che per la creazione, l'utilizzo, il mantenimento e l'associazione a tipi.

In quanto parte dei rispettivi metadati, tutti i componenti gestiti contengono informazioni sui componenti e le risorse in base ai quali sono stati compilati. Il runtime usa tali informazioni per garantire la disponibilità delle versioni specificate del software necessario al funzionamento del componente o dell'applicazione, riducendo così il rischio di interruzioni del codice dovute all'irreperibilità di alcune dipendenze. Le informazioni di registrazione e i dati dello stato non vengono più archiviati nel Registro di sistema, in cui poteva essere difficile individuarli e gestirli. Le informazioni sui tipi definiti e sulle relative dipendenze vengono invece archiviate con il codice in forma di metadati. Questo semplifica le attività di replica e rimozione di componenti.

I compilatori e gli strumenti dei linguaggi sono progettati per esporre le funzionalità del runtime secondo modalità utili e intuitive per gli sviluppatori. Alcune funzionalità del runtime potrebbero quindi essere più evidenti in un ambiente rispetto a un altro. Il modo di percepire il funzionamento dell'ambiente di esecuzione dipende dai compilatori o dagli strumenti dei linguaggi usati. Uno sviluppatore di Visual Basic, ad esempio, potrà notare in questo linguaggio una maggiore presenza di funzionalità orientate a oggetti, offerte da CLR. Il runtime offre i vantaggi seguenti:

  • Miglioramenti delle prestazioni.

  • Possibilità di utilizzare con facilità componenti sviluppati in altri linguaggi.

  • La disponibilità dei tipi estensibili forniti da una libreria di classi.

  • Funzionalità del linguaggio come ereditarietà, interfacce e overload per la programmazione orientata a oggetti.

  • Supporto per il modello di threading Free esplicito che consente la creazione di applicazioni scalabili e a thread multipli.

  • Supporto per la gestione delle eccezioni strutturata.

  • Supporto per gli attributi personalizzati.

  • Garbage Collection.

  • Utilizzo dei delegati invece dei puntatori a funzioni con conseguente miglioramento dell'indipendenza dai tipi e della sicurezza dei tipi. Per altre informazioni sui delegati, vedere Common Type System.

Versioni CLR

Le versioni di .NET Core e .NET 5+ hanno un'unica versione del prodotto, ovvero non esiste una versione di CLR separata. Per un elenco delle versioni di .NET Core, vedere Scaricare .NET Core.

Il numero di versione di .NET Framework, tuttavia, non corrisponde necessariamente al numero di versione di CLR inclusa. Per un elenco delle versioni di .NET Framework e delle versioni di CLR corrispondenti, vedere Versioni e dipendenze di .NET Framework.

Posizione Descrizione
Managed Execution Process Vengono descritti i passaggi necessari per essere in condizione di sfruttare i vantaggi di Common Language Runtime.
Gestione automatica della memoria Viene descritta la modalità usata dal Garbage Collector per allocare e liberare memoria.
Panoramica di .NET Framework Descrive i concetti principali di .NET Framework quali Common Type System, l'interoperabilità tra più linguaggi, l'esecuzione gestita, i domini delle applicazioni e gli assembly.
Common Type System Vengono descritte le modalità di dichiarazione, utilizzo e gestione dei tipi nell'ambiente di esecuzione in supporto all'integrazione tra i linguaggi.