.NET Standard

.NET Standard è una specifica formale delle API .NET disponibili in più implementazioni .NET. La motivazione alla base di .NET Standard era quella di stabilire una maggiore uniformità nell'ecosistema .NET. .NET 5 e versioni successive adottano un approccio diverso per stabilire l'uniformità che consente di evitare il ricorso a .NET Standard nella maggior parte degli scenari. Se, tuttavia, si vuole condividere il codice tra .NET Framework e qualsiasi altra implementazione di .NET, ad esempio .NET Core, è necessario impostare .NET Standard 2.0 come destinazione della libreria. Non verranno rilasciate nuove versioni di .NET Standard, ma .NET 5 e tutte le versioni successive continueranno a supportare .NET Standard 2.1 e le versioni precedenti.

Per informazioni sulla scelta tra .NET 5 e versioni successive e .NET Standard, vedere .NET 5 e versioni successive e .NET Standard più avanti in questo articolo.

Versioni di .NET Standard

.NET Standard supporta il controllo delle versioni. A ogni nuova versione vengono aggiunte altre API. Quando una libreria viene creata in base a una determinata versione di .NET Standard, può essere eseguita in qualsiasi implementazione di .NET che implementa tale versione di .NET Standard (o versioni successive).

Se si definisce come destinazione di una libreria una versione superiore di .NET Standard il numero di API disponibili è più elevato, ma la libreria essere usata solo in versioni più recenti di .NET. Se invece si definisce come destinazione una versione inferiore si riduce il numero di API disponibili, ma la libreria offre maggiore compatibilità.

Selezionare la versione di .NET Standard

In .NET Standard 1.0 sono presenti 7.949 delle 37.118 API disponibili.

Implementazione .NET Supporto versione
.NET e .NET Core 1.0, 1.1, 2.0, 2.1, 2.2, 3.0, 3.1, 5.0, 6.0, 7.0, 8.0
.NET Framework 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
Mono 4.6, 5.4, 6.4
Xamarin.iOS 10.0, 10.14, 12.16
Xamarin.Mac 3.0, 3.8, 5.16
Xamarin.Android 7.0, 8.0, 10.0
Piattaforma UWP (Universal Windows Platform) 8.0, 8.1, 10.0, 10.0.16299, da definire
Unity 2018.1

Per altre informazioni, vedere .NET Standard 1.0. Per una tabella interattiva, vedere .NET Standard versions (Versioni di .NET Standard).

Quale versione di .NET Standard definire come destinazione

È consigliabile usare .NET Standard 2.0 come versione di destinazione, a meno che non sia necessario supportare una versione precedente. La maggior parte delle librerie per utilizzo generico non necessita di API al di fuori di .NET Standard 2.0. .NET standard 2.0 è supportato da tutte le piattaforme moderne ed è il modo consigliato per supportare più piattaforme con una sola destinazione.

Se è necessario supportare .NET Standard 1.x, è consigliabile definire come destinazione anche .NET Standard 2.0. .NET standard 1.x è distribuito come set granulare di pacchetti NuGet, che crea un grafo delle dipendenze dei pacchetti di grandi dimensioni e obbliga gli sviluppatori a scaricare numerosi pacchetti durante la compilazione. Per altre informazioni, vedere Specifica di destinazioni multipiattaforma e .NET 5 e versioni successive e .NET Standard più avanti in questo articolo.

Regole per il controllo delle versioni di .NET standard

Esistono due regole principali per il controllo delle versioni:

  • Additive: le versioni di .NET Standard sono cerchi concentrici da un punto di vista logico, ovvero le versioni successive includono tutte le API delle versioni precedenti. Non vengono apportate modifiche importanti tra una versione e l'altra.
  • Non modificabili: dopo essere state rilasciate, le versioni di .NET Standard sono bloccate.

Non saranno disponibili nuove versioni di .NET Standard dopo la 2.1. Per altre informazioni, vedere .NET 5 e versioni successive e .NET Standard più avanti in questo articolo.

Specifica

La specifica di .NET Standard è un set standardizzato di API. La specifica viene gestita dagli implementatori di .NET, in particolare Microsoft (include .NET Framework, .NET Core e Mono) e Unity.

Elementi ufficiali

La specifica ufficiale è un insieme di file con estensione cs che definiscono le API che fanno parte di .NET Standard. La directory ref nel repository dotnet/standard (ora archiviato) definisce le API di .NET Standard.

Il metapacchetto NETStandard.Library (origine) descrive il set di librerie che definiscono (in parte) una o più versioni di .NET Standard.

Un componente specifico, ad esempio System.Runtime, descrive quanto segue:

  • Parte di .NET Standard (solo il relativo ambito).
  • Diverse versioni di .NET Standard per tale ambito.

Vengono forniti elementi derivati per facilitare le operazioni di lettura e abilitare alcuni scenari di sviluppo (ad esempio l'uso di un compilatore).

Rappresentazione dei pacchetti

Il principale veicolo di distribuzione degli assembly di riferimento di .NET Standard sono i pacchetti NuGet. Le implementazioni vengono distribuite con modalità diverse, appropriate per ogni implementazione di .NET.

I pacchetti NuGet hanno come destinazione uno o più framework. La destinazione dei pacchetti .NET Standard è il framework ".NET Standard". È possibile definire come destinazione il framework .NET Standard usando il netstandardTFM (Target Framework Moniker) compatto (ad esempio netstandard1.4). È necessario definire questo framework come destinazione di librerie da eseguire in più implementazioni di .NET. Per il set più ampio di API, indicare netstandard2.0 come destinazione poiché il numero di API è più che raddoppiato tra .NET Standard 1.6 e 2.0.

Il metapacchetto NETStandard.Library fa riferimento al set completo di pacchetti NuGet che definiscono .NET Standard. Il modo più comune di definire netstandard come destinazione è fare riferimento a questo metapacchetto. Questo metapacchetto descrive e fornisce l'accesso alle circa 40 librerie .NET e alle API associate che definiscono .NET Standard. È possibile fare riferimento a pacchetti aggiuntivi che hanno netstandard come destinazione per ottenere accesso ad altre API.

Controllo delle versioni

La specifica non è singola, ma costituisce un set di API con controllo delle versioni lineare. La prima versione dello standard definisce un set di dati di riferimento delle API. Le versioni successive aggiungono nuove API ed ereditano quelle definite dalle versioni precedenti. Non esiste alcuna clausola per la rimozione delle API da .NET Standard.

.NET Standard non è specifico di alcuna implementazione di .NET e non corrisponde allo schema di controllo delle versioni di nessuna di queste implementazioni.

Come accennato in precedenza, non saranno disponibili nuove versioni di .NET Standard dopo la 2.1.

Definire la destinazione per .NET Standard

È possibile creare librerie .NET Standard usando una combinazione di framework netstandard e metapacchetto NETStandard.Library.

Modalità di compatibilità di .NET Framework

A partire da .NET Standard 2.0 è stata introdotta la modalità di compatibilità di .NET Framework. Questa modalità consente ai progetti .NET Standard di fare riferimento a librerie .NET Framework come se fossero compilate per .NET Standard. I riferimenti alle librerie .NET Framework non funzionano per tutti i progetti, ad esempio se la libreria usa API Windows Presentation Foundation (WPF).

Per altre informazioni, vedere Modalità di compatibilità di .NET Framework.

Librerie .NET Standard e Visual Studio

Per creare librerie .NET Standard in Visual Studio, assicurarsi di avere Visual Studio 2022, Visual Studio 2019 o Visual Studio 2017 versione 15.3 o successive installato in Windows, o Visual Studio per Mac versione 7.1 o successive installato in macOS.

Se si devono usare le librerie .NET Standard 2.0 solo nei propri progetti, è anche possibile usare Visual Studio 2015. Tuttavia, deve essere installato il client NuGet versione 3.6 o successiva. È possibile scaricare il client NuGet per Visual Studio 2015 dalla pagina di download di NuGet.

.NET 5 e versioni successive e .NET Standard

.NET 5, .NET 6, .NET 7 e .NET 8 sono prodotti singoli con un set uniforme di funzionalità e API che possono essere usate per app desktop di Windows e app console multipiattaforma, servizi cloud e siti Web. I moniker framework di destinazione (TFM) di .NET 8, ad esempio, rispecchiano questa ampia gamma di scenari:

  • net8.0

    Questo TFM viene usato per codice eseguito ovunque. Con alcune eccezioni, include solo tecnologie che funzionano su più piattaforme. Per il codice .NET 8 net8.0 sostituisce i TFM netcoreapp e netstandard.

  • net8.0-windows

    Questo è un esempio di TFM specifico del sistema operativo che aggiunge funzionalità specifiche del sistema operativo a tutto ciò a cui fa riferimento net8.0.

Quando specificare come destinazione .NET 8.0 rispetto a .NET Standard

Per il codice esistente destinato a netstandard, non è necessario modificare il TFM in net8.0 o in un TFM successivo. .NET 8 implementa .NET Standard 2.1 e versioni precedenti. L'unico motivo per cui modificare la versione di destinazione da .NET Standard a .NET 8 e versioni successive è ottenere l'accesso a più funzionalità di runtime, funzionalità del linguaggio o API. Ad esempio, per usare C# 9, è necessario usare impostare come destinazione .NET 5 o una versione successiva. È possibile impostare più destinazioni per .NET 8 e .NET Standard per ottenere l'accesso a funzionalità più recenti e avere comunque a disposizione la libreria per altre implementazioni di .NET.

Ecco alcune linee guida per il nuovo codice per .NET 5 e versioni successive:

  • Componenti dell'app

    Se si usano librerie per suddividere un'applicazione in diversi componenti, è consigliabile specificare net8.0 come destinazione. Per semplicità, è consigliabile usare la stessa versione di .NET per tutti i progetti che costituiscono l'applicazione. È quindi possibile presupporre ovunque le stesse funzionalità della libreria di classi di base (BCL).

  • Librerie riutilizzabili

    Se si creano librerie riutilizzabili che si intende distribuire in NuGet, è opportuno considerare il compromesso tra la copertura e il set di funzionalità disponibili. .NET Standard 2.0 è la versione più recente supportata da .NET Framework, quindi offre una buona copertura e un set di funzionalità abbastanza esteso. Non è consigliabile impostare come destinazione .NET Standard 1.x perché si limiterebbe il set di funzionalità disponibile a fronte di un aumento minimo della copertura.

    Se non è necessario supportare .NET Framework, è possibile scegliere .NET Standard 2.1 o .NET 8. È consigliabile ignorare .NET Standard 2.1 e passare direttamente a .NET 8. La maggior parte delle librerie più usate supporterà più destinazioni sia per .NET Standard 2.0 che per .NET 5 e versioni successive. Il supporto di .NET Standard 2.0 offre la massima copertura, mentre il supporto di .NET 5 e versioni successive garantisce la possibilità di sfruttare le funzionalità più recenti della piattaforma per i clienti usano già .NET 5 e versioni successive.

Problemi di .NET Standard

Ecco alcuni problemi relativi a .NET Standard che spiegano perché .NET 5 e versioni successive sono la soluzione migliore per condividere il codice tra piattaforme e carichi di lavoro:

  • Lentezza nell'aggiunta di nuove API

    .NET Standard è stato creato come set di API che tutte le implementazioni .NET avrebbero dovuto supportare, quindi è stato avviato un processo di revisione delle proposte di aggiunta di nuove API. L'obiettivo è stato quello di standardizzare solo le API da implementate in tutte le piattaforme .NET correnti e future. Il risultato è stato che se una funzione non è stata rilasciata in una determinata versione, potrebbe essere necessario attendere un paio d'anni prima che venga aggiunta a una versione di Standard. In tal caso, si deve aspettare ancora di più perché la nuova versione di .NET Standard sia ampiamente supportata.

    Soluzione in .NET 5 e versioni successive: quando viene implementata una funzionalità, è già disponibile per ogni app e libreria .NET 5 e versioni successive perché la codebase è condivisa. Inoltre, poiché non esiste alcuna differenza tra la specifica dell'API e la relativa implementazione, è possibile sfruttare le nuove funzionalità molto più velocemente rispetto a .NET Standard.

  • Controllo delle versioni complesso

    La separazione della specifica dell'API dalle relative implementazioni comporta un mapping complesso tra le versioni delle specifiche dell'API e le versioni di implementazione. Questa complessità è evidente nella tabella illustrata in precedenza in questo articolo e nelle istruzioni su come interpretarla.

    Soluzione in .NET 5 e versioni successive: non esiste alcuna separazione tra una specifica API .NET 5 e versioni successive e la relativa implementazione. Il risultato è uno schema TFM semplificato. Esiste un unico prefisso TFM per tutti i carichi di lavoro: net8.0 viene usato per librerie, app console e app Web. L'unica variante è un suffisso che contraddistingue le API specifiche della piattaforma per una determinata piattaforma, ad esempio net8.0-windows. Grazie a questa convenzione di denominazione TFM, è possibile sapere facilmente se una determinata app può usare una determinata libreria. Non è necessaria alcuna tabella di numeri di versione equivalenti, come quella per .NET Standard.

  • Eccezioni non supportate dalla piattaforma in fase di esecuzione

    .NET Standard espone API specifiche della piattaforma. Il codice potrebbe essere compilato senza errori e sembra essere portabile in qualsiasi piattaforma anche se non lo è. Quando viene eseguito in una piattaforma che non include un'implementazione per una determinata API, vengono visualizzati errori di runtime.

    Soluzione in .NET 5 e versioni successive: gli SDK .NET 5 e versioni successive includono analizzatori di codice che sono abilitati per impostazione predefinita. L'analizzatore della compatibilità della piattaforma rileva l'uso non intenzionale delle API non supportate nelle piattaforme in cui si intende eseguirle. Per altre informazioni, vedere Analizzatore di compatibilità della piattaforma.

.NET Standard non deprecato

.NET Standard è ancora necessario per le librerie che possono essere usate da più implementazioni di .NET. È consigliabile usare .NET Standard come destinazione negli scenari seguenti:

  • Usare netstandard2.0 per condividere il codice tra .NET Framework e tutte le altre implementazioni di .NET.
  • Usare netstandard2.1 per condividere il codice tra Mono, Xamarin e .NET Core 3.x.

Vedi anche