.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
Se si usa .NET Standard 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 e .NET Framework non supporta .NET Standard 2.1. .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 viene distribuito come set granulare di pacchetti NuGet, che crea un grafico delle dipendenze di pacchetti di grandi dimensioni e comporta il download di molti pacchetti al momento della compilazione del progetto. Per altre informazioni, vedere Specifica di destinazioni multipiattaforma e .NET 5 e versioni successive e .NET Standard più avanti in questo articolo.
Nota
A partire da .NET 9, viene generato un avviso di compilazione se il progetto è destinato a .NET Standard 1.x. Per altre informazioni, vedere Avviso generato per le destinazioni .NET Standard 1.x.
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).
- Elenco di API in Markdown.
- Assembly di riferimento, distribuiti come pacchetti NuGet e usati come riferimento dal metapacchetto NETStandard.Library.
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 specificare come destinazione il framework .NET Standard usando il netstandard
moniker del framework di destinazione compatto (TFM), ad esempio netstandard1.4
. Le librerie che devono essere eseguite in più implementazioni di .NET devono essere destinate al framework .NET Standard. 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, .NET 8 e .NET 9 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 TFMnetcoreapp
enetstandard
.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 scegliere come destinazione net8.0
e netstandard
Per il codice esistente destinato a .NET Standard 2.0 o versione successiva, non è necessario modificare TMF 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.
Nota
Se il progetto è destinato a .NET Standard 1.x, è consigliabile ridestinarlo in .NET Standard 2.0 o .NET 6+. Per altre informazioni, vedere Avviso generato per le destinazioni .NET Standard 1.x.
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 supporta 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 esempionet8.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.