.NET Standard

.NET Standard è una specifica formale delle API .NET disponibili in più implementazioni .NET. La motivazione alla base .NET Standard è stata stabilire una maggiore uniformità nell'ecosistema .NET. .NET 5 e versioni successive adottano un approccio diverso per stabilire l'uniformità che elimina la necessità di .NET Standard nella maggior parte degli scenari. Tuttavia, se si vuole condividere il codice tra .NET Framework e qualsiasi altra implementazione di .NET, ad esempio .NET Core, la libreria deve essere .NET Standard 2.0. Non verranno rilasciate nuove versioni .NET Standard, ma .NET 5, .NET 6 e tutte le versioni future continueranno a supportare .NET Standard 2.1 e versioni precedenti.

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

Versioni di .NET Standard

.NET Standard il controllo delle versioni. Ogni nuova versione aggiunge altre API. Quando una libreria viene compilata su una determinata versione di .NET Standard, può essere eseguita in qualsiasi implementazione .NET che implementa tale versione di .NET Standard (o versione successiva).

La destinazione di una versione più .NET Standard consente a una libreria di usare più API, ma significa che può essere usata solo in versioni più recenti di .NET. La destinazione di una versione inferiore riduce le API disponibili, ma significa che la libreria può essere eseguita in più posizioni.

Selezionare .NET Standard versione

.NET Standard 1.0 ha 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
.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
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, TBD
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 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 versioni .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 (ora archiviato) definisce le .NET STANDARD seguenti.

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 hanno come destinazione il framework ".NET Standard". È possibile definire come destinazione il framework .NET Standard usando il netstandardnetstandard (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 metapacchetto NETStandard.Library fa riferimento al set completo di pacchetti NuGet 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 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 è 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 nessuna di queste implementazioni.

Come già detto, non saranno disponibili nuove versioni .NET Standard successive alla 2.1.

Destinazione .NET Standard

È possibile compilare .NET Standard librerie usando una combinazione del framework e del 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 compilare librerie .NET Standard in Visual Studio, assicurarsi di aver installato Visual Studio 2022, Visual Studio 2019 o Visual Studio 2017 versione 15.3 o successiva in Windows o Visual Studio per Mac versione 7.1 o successiva installata 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 e .NET 6 sono singoli prodotti con un set uniforme di funzionalità e API che possono essere usate per app desktop Windows e app console multipiattaforma, servizi cloud e siti Web. I TFM .NET 5, ad esempio, 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 TFMs netstandard .

  • net5.0-windows

    Questo è un esempio di TFM specifico del sistema operativo che aggiunge funzionalità specifiche del sistema operativo a tutti gli elementi a cui fa riferimento.

Quando impostare come destinazione net5.0 o net6.0 rispetto a netstandard

Per il codice esistente destinato a netstandard, non è necessario modificare TFM in net5.0 o net6.0. .NET 5 e .NET 6 implementano .NET Standard 2.1 e versioni precedenti. L'unico motivo per ridestinare il .NET Standard a .NET 5+ è ottenere l'accesso a più funzionalità di runtime, funzionalità del linguaggio o API. Ad esempio, per usare C# 9, è necessario usare .NET 5 o versione successiva. È possibile multitargeting di .NET 5 o .NET 6 e .NET Standard 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 più componenti, è consigliabile scegliere come destinazione net5.0 o net6.0. 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/6. È consigliabile ignorare .NET Standard 2.1 e passare direttamente a .NET 6. Le librerie più usate saranno multi-destinazione per .NET Standard 2.0 e .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 e versioni successive sono il modo 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 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. Poiché 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+ e la relativa implementazione. Il risultato è uno schema TFM semplificato. Esiste un prefisso TFM per tutti i carichi di lavoro: net5.0 o net6.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 o net6.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 per qualsiasi piattaforma anche se non è portabile. Quando viene eseguito in una piattaforma che non dispone di un'implementazione per una determinata API, si verificano errori di runtime.

    Soluzione in .NET 5+: Gli SDK .NET 5+ includono analizzatori del codice abilitati per impostazione predefinita. L'analizzatore di compatibilità della piattaforma rileva l'uso non intenzionale delle API non supportate nelle piattaforme in cui si intende eseguire. Per altre informazioni, vedere Analizzatore di compatibilità della 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