.NET Standard

.NET Standard è una specifica formale delle API .NET disponibili in più implementazioni .NET. La motivazione alla base .NET Standard era stabilire una maggiore uniformità nell'ecosistema .NET. Tuttavia, .NET 5 adotta un approccio diverso per stabilire l'uniformità e questo nuovo approccio elimina la necessità di .NET Standard in molti scenari. Per altre informazioni, vedere .NET 5 e .NET Standard più avanti in questo articolo.

Supporto per le implementazioni di .NET

Le diverse implementazioni di .NET specificano come destinazione determinate versioni di .NET Standard. Ogni versione dell'implementazione di .NET annuncia la versione .NET Standard più recente supportata, implicando che sono supportate anche le versioni precedenti. Ad esempio, .NET Framework 4.6 implementa .NET Standard 1.3, ovvero espone tutte le API definite in .NET Standard versioni da 1.0 a 1.3. Analogamente, .NET Framework 4.6.1 implementa .NET Standard 1.4, mentre .NET 5.0 implementa .NET Standard 2.1.

Nella tabella seguente sono elencate le versioni minime di implementazione che supportano ogni .NET Standard versione. Ciò significa che le versioni successive di un'implementazione elencata supportano anche la versione .NET Standard precedente. Ad esempio, .NET Core 2.1 e versioni successive supportano .NET Standard 2.0 e versioni precedenti.

.NET Standard 1.0 1.1 1.2 1.3 1.4 1.5 1.6 2.0 2.1
.NET 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0
.NET Core 1.0 1.0 1.0 1.0 1.0 1.0 1.0 2.0 3,0
.NET Framework 1 4.5 4.5 4.5.1 4,6 4.6.1 4.6.1 2 4.6.1 2 4.6.1 2 N/A3
Mono 4,6 4,6 4,6 4,6 4,6 4,6 4,6 5.4 6.4
Xamarin.iOS 10,0 10,0 10,0 10,0 10,0 10,0 10,0 10.14 12.16
Xamarin.Mac 3,0 3,0 3,0 3,0 3,0 3,0 3,0 3.8 5.16
Xamarin.Android 7.0 7.0 7.0 7.0 7.0 7.0 7.0 8.0 10,0
Piattaforma UWP (Universal Windows Platform) 10,0 10,0 10,0 10,0 10,0 10.0.16299 10.0.16299 10.0.16299 TBD
Unity 2018.1 2018.1 2018.1 2018.1 2018.1 2018.1 2018.1 2018.1 2021.2.0b6

1 Le versioni elencate per .NET Framework si applicano a .NET Core 2.0 SDK e alle versioni successive degli strumenti. Le versioni precedenti usava un mapping diverso .NET Standard 1.5 e versioni successive. È possibile scaricare gli strumenti per gli strumenti di .NET Core per Visual Studio 2015 se non è possibile eseguire l'aggiornamento a Visual Studio 2017 o versione successiva.

2 Le versioni elencate di seguito rappresentano le regole NuGet per determinare se una determinata .NET Standard è applicabile. Anche se NuGet considera .NET Framework 4.6.1 come supporto di .NET Standard dalla 1.5 alla 2.0, esistono diversi problemi con l'utilizzo delle librerie .NET Standard compilate per tali versioni da progetti .NET Framework 4.6.1. Per .NET Framework che devono usare tali librerie, è consigliabile aggiornare il progetto alla versione di destinazione .NET Framework 4.7.2 o versione successiva.

3 .NET Framework non supporta .NET Standard 2.1. Per altre informazioni, vedere l'annuncio di .NET Standard 2.1.

  • Le colonne rappresentano le versioni di .NET Standard. Ogni cella di intestazione è un collegamento a un documento che mostra quali API sono state aggiunte nella specifica versione di .NET Standard.
  • Le righe rappresentano le diverse implementazioni di .NET.
  • Il numero di versione in ogni cella indica la versione minima dell'implementazione necessaria per usare tale specifica versione di .NET Standard come destinazione.
  • Per una tabella interattiva, vedere .NET Standard versions (Versioni di .NET Standard).

Per trovare la versione più recente di .NET Standard che è possibile definire come destinazione, eseguire le operazioni seguenti:

  1. Individuare la riga che indica l'implementazione di .NET usata per l'esecuzione.
  2. All'interno della riga, individuare la colonna che indica la versione in uso a partire da destra verso sinistra.
  3. L'intestazione colonna indica la versione di .NET Standard supportata dall'attuale destinazione. È anche possibile impostare il supporto di qualsiasi versione di .NET Standard inferiore. Anche le versioni di .NET Standard superiori supporteranno l'implementazione.
  4. Ripetere questo processo per ogni piattaforma da definire come destinazione. Se si hanno più piattaforme di destinazione, usare la versione inferiore tra quelle disponibili. Ad esempio, se si vuole eseguire in .NET Framework 4.8 e .NET 5.0, la versione .NET Standard più alta che è possibile usare è .NET Standard 2.0.

Quale versione di .NET Standard definire come destinazione

È consigliabile scegliere come destinazione .NET Standard 2.0, 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 scegliere 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 Targeting multipiattaforma e .NET 5 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 .NET Standard versioni successive alla 2.1. Per altre informazioni, vedere .NET 5 e .NET Standard più avanti in questo articolo.

Specifiche

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

Elementi ufficiali

La specifica ufficiale è un set di file con estensione cs che definiscono le API che fanno parte dello standard. La directory ref nel repository dotnet/standard 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. .NET Standard pacchetti sono mirati al framework ".NET Standard". È possibile definire come destinazione il framework .NET Standard usando il netstandard TFM (Target Framework Moniker) compatto (ad esempio netstandard1.4). Le librerie destinate all'esecuzione in più implementazioni di .NET devono essere destinate a questo framework. 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 NETStandard.Library metapacchetto fa riferimento al set completo NuGet pacchetti che definiscono .NET Standard. Il modo più comune per definire netstandard come destinazione consiste nel 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. Per accedere ad API aggiuntive, è possibile fare riferimento ad altri pacchetti che hanno come destinazione netstandard.

Controllo delle versioni

La specifica non è singolare, ma un set di API con versione 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 è stato stabilito alcun provisioning per la rimozione delle API dallo standard.

.NET Standard non è specifico di alcuna implementazione .NET, né corrisponde a uno schema di controllo delle versioni di una di queste implementazioni.

Come illustrato in precedenza, non saranno disponibili nuove .NET Standard versioni successive alla 2.1.

Destinazione .NET Standard

È possibile compilare .NET Standard librerie usando una combinazione del netstandard framework e del NETStandard.Library metapacchetto.

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 compilare librerie .NET Standard in Visual Studio, assicurarsi di avere installato Visual Studio 2019 o Visual Studio 2017 versione 15.3 o successiva in Windows o Visual Studio per Mac versione 7.1 o successiva 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 .NET Standard

.NET 5 è l'implementazione di .NET che Microsoft sta sviluppando attivamente. Si tratta di un singolo prodotto con un Windows set uniforme di funzionalità e API che possono essere usate per app desktop e app console multipiattaforma, servizi cloud e siti Web. Le TPM .NET 5.0 riflettono questa ampia gamma di scenari:

  • net5.0

    Questo TFM è per il codice che viene eseguito ovunque. Con alcune eccezioni, include solo tecnologie che funzionano multipiattaforma. Per il codice .NET 5, net5.0 sostituisce sia netcoreapp e netstandard TFMs.

  • net5.0-windows

    Questo è un esempio di TPM specifici del sistema operativo che aggiungono funzionalità specifiche del sistema operativo a tutti gli elementi net5.0 a cui fa riferimento.

Quando impostare come destinazione net5.0 e netstandard

Per il codice esistente destinato a , non è netstandard necessario modificare TFM in net5.0 . .NET 5.0 implementa .NET Standard 2.1 e versioni precedenti. L'unico motivo per ridestinare il .NET Standard a .NET 5.0 è ottenere l'accesso a più funzionalità di runtime, funzionalità del linguaggio o API. Ad esempio, per usare C# 9, è necessario usare .NET 5.0 come destinazione. È possibile usare .NET 5.0 e .NET Standard multitargeting per ottenere l'accesso alle funzionalità più nuove e avere comunque la libreria disponibile per altre implementazioni di .NET.

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

  • Componenti dell'app

    Se si usano librerie per suddividere un'applicazione in diversi componenti, è consigliabile scegliere come destinazione la versione net5.x di .NET 5 meno recente a cui l'applicazione può essere 5.x destinazione. Per semplicità, è meglio mantenere tutti i progetti che costituiscono l'applicazione nella stessa versione di .NET. È quindi possibile presupporre le stesse funzionalità BCL ovunque.

  • Librerie riutilizzabili

    Se si stanno creando librerie riutilizzabili che si prevede di spedire NuGet, prendere in considerazione il compromesso tra copertura e set di funzionalità disponibili. .NET Standard 2.0 è la versione più recente supportata da .NET Framework, quindi offre una buona copertura con un set di funzionalità piuttosto grande. Non è consigliabile scegliere come destinazione .NET Standard 1.x, perché si limiterebbe il set di funzionalità disponibile per un aumento minimo della copertura.

    Se non è necessario supportare .NET Framework, è possibile passare a .NET Standard 2.1 o .NET 5. È consigliabile ignorare .NET Standard 2.1 e passare direttamente a .NET 5. Le librerie più usate finiranno per la multi-destinazione sia per .NET Standard 2.0 che per .NET 5. Il supporto .NET Standard 2.0 offre la massima copertura, mentre il supporto di .NET 5 garantisce che sia possibile sfruttare le funzionalità della piattaforma più recenti per i clienti che sono già in .NET 5.

.NET Standard problemi

Di seguito sono riportati alcuni .NET Standard che spiegano perché .NET 5 è il modo migliore per condividere il codice tra piattaforme e carichi di lavoro:

  • Lentezza per l'aggiunta di nuove API

    .NET Standard creato come set di API che tutte le implementazioni .NET devono supportare, quindi è stato creato un processo di revisione per le proposte di aggiunta di nuove API. L'obiettivo era standardizzare solo le API che potevano essere implementate in tutte le piattaforme .NET correnti e future. Il risultato è che se una funzionalità ha perso una versione specifica, potrebbe essere necessario attendere un paio di anni prima di essere aggiunta a una versione dello standard. Si attenderebbe quindi ancora più a lungo che la nuova versione di .NET Standard sia ampiamente supportata.

    Soluzione in .NET 5: Quando viene implementata, una funzionalità è già disponibile per ogni app e libreria .NET 5 perché la codebase è condivisa. Dato che non esiste alcuna differenza tra la specifica API e la relativa implementazione, è possibile sfruttare le nuove funzionalità molto più rapidamente rispetto a .NET Standard.

  • Controllo delle versioni complesso

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

    Soluzione in .NET 5: Non esiste alcuna separazione tra una specifica dell'API .NET 5.x e la relativa implementazione. Il risultato è uno schema TFM semplificato. Esiste un prefisso TFM per tutti i carichi di lavoro: net5.0 viene usato per librerie, app console e app Web. L'unica variazione è un suffisso che specifica LE API specifiche della piattaforma per una determinata piattaforma, ad esempio net5.0-windows . Grazie a questa convenzione di denominazione TFM, è possibile stabilire facilmente se una determinata app può usare una determinata libreria. Non è necessaria alcuna tabella equivalente al numero di versione come quella .NET Standard versione.

  • 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 è portabile. Quando viene eseguito in una piattaforma che non ha un'implementazione per una determinata API, si verificano errori di runtime.

    Soluzione in .NET 5: .NET 5 SDK include analizzatori del codice abilitati per impostazione predefinita. L'analizzatore della compatibilità della piattaforma rileva l'uso involontario di API non supportate nelle piattaforme in cui si intende eseguire. Per altre informazioni, vedere Analizzatore compatibilità piattaforma.

.NET Standard deprecato

.NET Standard è ancora necessario per le librerie che possono essere usate da più implementazioni .NET. È consigliabile usare come destinazione .NET Standard 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