Condividi tramite


.NET Standard

.NET Standard è una specifica formale delle API di .NET disponibili in più implementazioni di .NET. La motivazione alla base di .NET Standard era 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 avere come destinazione .NET Standard 2.0. No le nuove versioni di .NET Standard verranno rilasciate, ma .NET 5 e tutte le versioni successive 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 è versionato. A ogni nuova versione vengono aggiunte altre API. Quando una libreria viene compilata in base a 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ù recente di .NET Standard consente a una libreria di usare più API, ma significa che può 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 .NET versione Standard

.NET Standard 1.0 ha 7.949 delle 37.118 API disponibili.

implementazione .NET Supporto delle versioni
.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, 9.0, 10.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
Universal Windows Platform 8.0, 8.1, 10.0, 10.0.16299, da definire
Unità 2018.1

Per altre informazioni, vedere .NET Standard 1.0. Per una tabella interattiva, vedere .NET versioni Standard.

Quale .NET versione Standard di destinazione

Se la destinazione è .NET Standard, è 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 deve richiedere 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 un'unica destinazione.

Se è necessario supportare .NET Standard 1.x, è consigliabile puntare anche a .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 quando viene compilato il progetto. Per ulteriori informazioni, vedere Cross-platform targeting e .NET 5+ 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 ulteriori informazioni, vedere Avviso generato per target .NET Standard 1.x.

.NET regole di controllo delle versioni standard

Esistono due regole principali per il controllo delle versioni:

  • Additivo: Le versioni dello Standard .NET sono cerchi concentrici logici: le versioni successive incorporano tutte le API delle versioni precedenti. Non vengono apportate modifiche importanti tra una versione e l'altra.
  • Non modificabile: una volta rilasciate, le versioni di .NET Standard sono bloccate.

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

Specifiche

La specifica .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.

Artefatti ufficiali

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

Il metapacchetto NETStandard.Library (source) 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).
  • Più 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 veicolo di distribuzione principale per gli assembly di riferimento standard .NET è un pacchetto NuGet. Le implementazioni vengono distribuite in diversi modi, appropriati per ogni implementazione .NET.

I pacchetti NuGet hanno come destinazione uno o più framework. .NET pacchetti Standard destinati al framework ".NET Standard". È possibile specificare come destinazione il framework .NET Standard usando il moniker del framework di destinazione netstandardcompact target framework (TFM), ad esempio, netstandard1.4. Le librerie che devono essere eseguite su più implementazioni di .NET devono essere destinate al framework standard .NET. Per il set più ampio di API, specificare come destinazione netstandard2.0, perché il numero di API disponibili è superiore al doppio 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. Descrive e fornisce l'accesso alle ~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 è unica, ma costituisce un set di API con versionamento 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 un'implementazione .NET, né corrisponde allo schema di controllo delle versioni di una di queste implementazioni.

Come indicato in precedenza, non saranno disponibili nuove versioni .NET Standard dopo la versione 2.1.

Target .NET Standard

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

modalità di compatibilità .NET Framework

A partire da .NET Standard 2.0, è stata introdotta la modalità di compatibilità di .NET Framework. Questa modalità di compatibilità consente .NET progetti Standard di fare riferimento alle librerie di .NET Framework come se fossero state compilate per .NET Standard. Il riferimento alle librerie di .NET Framework non funziona per tutti i progetti, ad esempio le librerie che usano API Windows Presentation Foundation (WPF).

Per altre informazioni, vedere .NET Framework compatibility mode.

librerie standard .NET e Visual Studio

Per compilare .NET librerie Standard in Visual Studio, assicurarsi di aver installato Visual Studio 2019 o versione successiva o Visual Studio 2017 versione 15.3 o successiva in Windows.

Se è sufficiente utilizzare .NET librerie Standard 2.0 nei progetti, è anche possibile farlo in 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 NuGet downloads.

.NET 5+ e .NET Standard

.NET 5, .NET 6, .NET 7, .NET 8, .NET 9 e .NET 10 sono prodotti singoli con un set uniforme di funzionalità e API che possono essere usate per Windows app desktop e app console multipiattaforma, servizi cloud e siti Web. Il .NET 10 TFMs, ad esempio, riflette questa vasta gamma di scenari:

  • net10.0

    Questo TFM viene usato per codice che funziona in tutti gli ambienti. Con alcune eccezioni, include solo tecnologie che funzionano su più piattaforme.

  • net10.0-windows

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

Quando scegliere come destinazione netx.0 e netstandard

Per il codice esistente destinato a .NET Standard 2.0 o versione successiva, non è necessario modificare il TFM in net8.0 o a un TFM successivo. .NET 8, .NET 9 e .NET 10 implementano .NET Standard 2.1 e versioni precedenti. L'unico motivo per cui eseguire il retarget da .NET Standard a .NET 8+ sarebbe quello di ottenere l'accesso a più funzionalità di runtime, funzionalità del linguaggio o API. Ad esempio, per usare C# 9, è necessario specificare come destinazione .NET 5 o versione successiva. È possibile puntare a più versioni di .NET e .NET Standard per accedere alle funzionalità più recenti e al contempo mantenere la libreria disponibile per altre implementazioni di .NET.

Nota

Se il progetto è mirato a .NET Standard 1.x, consigliamo di puntarlo nuovamente a .NET Standard 2.0 o .NET 8+. Per ulteriori informazioni, vedere Avviso generato per target .NET Standard 1.x.

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 specificare net10.0 come destinazione. Per semplicità, è consigliabile mantenere tutti i progetti che costituiscono l'applicazione nella stessa versione di .NET. È possibile quindi assumere ovunque le medesime funzionalità della Libreria di Classi 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 portata con un set di funzionalità abbastanza grande. Non è consigliabile impostare come destinazione .NET Standard 1.x, perché si limita il set di funzionalità disponibile per un aumento minimo di copertura.

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

Problemi di .NET Standard

Ecco alcuni problemi con .NET Standard che consentono di spiegare perché .NET 5 e versioni successive rappresentano 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 di .NET avrebbero dovuto supportare, quindi è stato eseguito un processo di revisione per le proposte per aggiungere nuove API. L'obiettivo era quello di standardizzare solo le API che potevano essere implementate in tutte le piattaforme di .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. Attenderete quindi ancora più a lungo che la nuova versione di .NET Standard sia ampiamente supportata.

    Solution in .NET 5+: Quando viene implementata una funzionalità, è già disponibile per ogni app e libreria .NET 5+ 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.

  • Versionamento 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.

    Solution in .NET 5+: Non esiste alcuna separazione tra una specifica API .NET 5+ e la relativa implementazione. Il risultato è uno schema TFM semplificato. Esiste un unico prefisso TFM per tutti i carichi di lavoro: net10.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 net10.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 equivalente al numero di versione, ad esempio 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 ha un'implementazione per una determinata API, vengono visualizzati errori di runtime.

    Solution in .NET 5+: Gli SDK di .NET 5+ includono analizzatori di codice 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 obsoleto

.NET Standard è ancora necessario per le librerie che possono essere usate da più implementazioni di .NET. È consigliabile specificare 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 e .NET Core 3.x.

Vedi anche