.NET Standard vs .NET Core


240

Ho letto della differenza tra .NET Standard e .NET Core, ma non so davvero quale sia la differenza, o quando scegliere un progetto di libreria .NET Standard e quando scegliere un progetto di libreria .NET Core.

Ho letto che .NET Standard garantisce che una serie di API sia sempre disponibile, indipendentemente dalla piattaforma utilizzata (purché tale piattaforma sia compatibile con la versione .NET Standard che ho scelto). Se non sbaglio, ciò significa che posso creare una libreria di classi di .NET Standard e quindi utilizzarla su qualsiasi piattaforma compatibile con la versione di .NET Standard che ho scelto.

Con .NET Core, ho letto che è destinato anche all'uso multipiattaforma, quindi se scelgo una libreria .NET Core sembra che possa usarla anche su molte piattaforme, proprio come .NET Standard.

Quindi alla fine non vedo la differenza. Quando dovrei usare quale? Qual'è la differenza tra loro?


33
In termini di codice: .net standard = interfaccia, .net core = classe; se si codifica contro la classe non si ottengono più metodi (ecc.), ma si è limitati a quel tipo concreto (e discendenti); se usi l'interfaccia potresti avere una superficie più piccola, ma funzionerà contro implementazioni arbitrarie ... fintanto che quelle implementazioni fanno ciò che ci si aspetta :) sì, il core .net prende di mira più piattaforme, ma ci sono altre implementazioni di .net standard
Marc Gravell

9
.NETStandard è un sostituto di PCL. Una Portable Class Library ti ha aiutato a scrivere una libreria che potrebbe essere eseguita su più di una piattaforma (telefono, desktop, negozio, browser, xbox, ecc.). Non si è ridimensionato molto bene, soffrendo molto per la n! problema, quindi l'hanno abbandonato. .NETCore è solo il primo framework che è stato realizzato, è stato il più semplice, il resto deve recuperare. Tieni presente che questo è molto work-in-progress, grandi cambiamenti in vista con .NETStandard v2.0. Lo standard per dominarli tutti, per ora :)
Hans Passant,

Si prega di non aggiungere domande extra a una esistente. La tua domanda nella modifica è separata da questa.
Jon Skeet,

1
@JonSkeet Quindi dovrei aprire una nuova domanda? Grazie per il consiglio. perché all'inizio ho aperto una nuova domanda sul multi target .net Core e sono stato sottoposto a downgrade perché hanno detto che è una domanda duplicata.
Álvaro García,

@ ÁlvaroGarcía: Sì, ma chiariscilo: la tua attuale domanda di una frase non mi è affatto chiara.
Jon Skeet,

Risposte:


195

Cercherò di chiarire ulteriormente i tuoi dubbi e di estendere la risposta di Jon Skeet.

.NET Standard è una specifica , quindi una libreria compilata per una specifica versione .NET Standard può essere utilizzata in diverse implementazioni .NET Standard.

Come detto in un altro mio commento, una buona analogia per la relazione tra .NET Standard e altre implementazioni di .NET Standard (.NET Core, .NET Framework, ecc.) È questa sintesi di David Fowler : le versioni di .NET Standard sono Interfaces, mentre i framework sono implementazioni di tali interfacce.

Questo diagramma semplificato può aiutare a comprendere questa relazione:

Analogia alle interfacce standard NET

Tutto il targeting NetCore10ha accesso ad INetStandard15API e API NetCore10 specifiche (come DotNetHostPolicy).

Naturalmente questa libreria non può essere utilizzata in diverse INetStandard15implementazioni ( NetCore10non è convertibile in NetFramework462o Mono46).

Se, invece, hanno bisogno di accedere solo alle INetStandard15API (e di destinazione che specifica invece di un quadro concreto) la libreria può essere utilizzato da qualsiasi quadro che l'implementa ( NetCore10, NetFramework462, ecc)

Nota: nell'analogia originale David Fowler utilizzava le interfacce sia per le versioni .NET Standard che per le implementazioni dei framework. Ritengo che l'utilizzo di interfacce e classi sia, invece, più intuitivo e rappresenti meglio il rapporto tra specifiche e implementazioni concrete.


2
Grazie mille per questo. Ma ho un dubbio. Se .net standard è un'interfaccia e può essere implementato ad esempio con .net framework e .net Core, quando creo una libreria di classi standard .net e utilizzo questa libreria in un altro progetto, quale implementazione sta usando, net framework o .net Nucleo?
Álvaro García,

8
Utilizzerà l'implementazione dell'applicazione compilata (qualunque essa sia). Se compili un'app core NET, utilizzerà le librerie core NET (che sono un'implementazione dello standard NET)
Federico Dipuma,

5
Questo diagramma è di grande aiuto per illustrare la relazione core / std / framework.
Jasper,

Quindi, se creo un'app console net461 e scelgo come destinazione una libreria netstandard2.0, nulla di quella lib standard si risolve nell'app console. Così... ??
Sinaesthetic,

2
Un'immagine vale più di mille parole
Nikaas,

182

.NET Core è un'implementazione di .NET Standard. È disponibile su più sistemi operativi, ma non è la stessa cosa: esistono anche altre implementazioni di .NET Standard.

Pertanto, se crei una libreria .NET Core, avrà accesso alle cose implementate in .NET Core, ma non fanno parte di .NET Standard e la tua libreria non sarà compatibile con altre implementazioni di .NET Standard, come Xamarin, Tizen, framework desktop .NET completo ecc.

In breve: per ottenere la massima portabilità, rendi la tua libreria di destinazione .NET Standard.


5
@ ÁlvaroGarcía: cosa intendi con "it" dovrebbe essere compatibile? .NET Core 1.0? Non necessariamente, poiché .NET Core 1.0 può ancora includere elementi extra . Tale voce indica che se si sceglie come destinazione .NET Standard 1.6, è possibile eseguire il codice in Mono 4.6 e .NET Core 1.0.
Jon Skeet,

4
Non è possibile eseguire un assembly .NET Core su qualcosa di diverso da .NET Core (CoreCLR e CoreFX). È possibile eseguire un assembly Standard .NET su qualsiasi framework che soddisfi gli obblighi contrattuali per lo Standard pertinente (1.3, 1.6, 2.0, ecc.).
Mark Rendle,

2
La multipiattaforma si riferisce al sistema operativo, non al framework.
Mark Rendle,

15
Come analogia, prova a immaginare .NET Standard come interfaccia (ad es INetStandard16.). .NET Core 1.0 e Mono 4.6 implementano entrambi INetStandard16. Non è possibile convertire .Net Core 1.0 in Mono 4.6 (e viceversa), ma tutto ciò che utilizza INetStandard16funzionerà su entrambi. (crediti a David Fowler )
Federico Dipuma,

6
Questo mi ha sorpreso. I nomi sembrano arretrati.
Penseresti

6

La libreria di classi .NET Core è fondamentalmente un sottoinsieme della libreria .NET Framework, che contiene solo un minor numero di API. Attenersi alla libreria .NET Core Class rende difficile condividere il codice tra i runtime. Questo codice potrebbe non funzionare per un runtime diverso (Mono per Xamarin), perché non ha l'API di cui hai bisogno. Per risolvere questo c'è .NET Standard, che è solo un insieme di specifiche che ti dice quali API puoi usare . Lo scopo principale di .NET Standard è condividere il codice tra i runtime. Ed è importante che questa specifica sia implementata da tutti i tempi di esecuzione. (.NET Framework, .NET Core e Mono per Xamarin).

Quindi, se sei sicuro di usare la tua libreria solo per progetti .NET Core, puoi ignorare .NET Standard, ma se c'è anche una piccola possibilità che il tuo codice sarà usato da .NET Framework o Mono per Xamarin, allora è meglio attenersi allo standard .NET

Inoltre, le versioni precedenti di .NET Standard contengono più API, ma le versioni inferiori sono supportate da più piattaforme. Pertanto, se si crea una libreria .NET Standard che si desidera condividere tra i runtime, scegliere come target la versione più bassa possibile , che consente di raggiungere la maggior parte delle piattaforme. Ad esempio, se si desidera eseguire su .NET Framework 4.5 e .NET Core 1.0, la versione .NET Standard più alta che è possibile utilizzare è .NET Standard 1.1. Fare riferimento a questa grande tabella dalla documentazione per ulteriori informazioni al riguardo.

PS: Inoltre, se desideri convertire la tua libreria in .NET Standard, .NET Portability Analyzer potrebbe aiutarti.


5

.NET Standard è una specifica delle API .NET destinate ad essere disponibili sulle implementazioni .NET. Ciò consente di definire un set uniforme di API BCL per tutte le implementazioni .NET.

.NET Core è una di queste implementazioni di .NET Standard. .NET Framework è un'altra implementazione di .NET Standard.

Immagine dal blog di .NET

inserisci qui la descrizione dell'immagine

La risposta di Federicos ti offre una panoramica grafica di come ogni framework si evolve con le versioni. Dai un'occhiata al diagramma seguente da Microsoft Docs .

inserisci qui la descrizione dell'immagine

Targeting .NET Standard aumenta il supporto della tua piattaforma mentre il targeting di una particolare piattaforma .NET come .NET Core (o .NET Framework) ti consentirà di utilizzare tutte le funzionalità della piattaforma per quella piattaforma.


2

.NET Standard è una specifica delle API che devono fornire tutte le implementazioni .NET. Fornisce coerenza alla famiglia .NET e consente di creare librerie che è possibile utilizzare da qualsiasi implementazione .NET. Sostituisce le PCL per la costruzione di componenti condivisi.

.NET Core è un'implementazione di .NET Standard ottimizzata per la creazione di applicazioni console, app Web e servizi cloud mediante ASP.NET Core. L'SDK viene fornito con un potente strumento che oltre allo sviluppo di Visual Studio supporta un flusso di lavoro di sviluppo completo basato sulla riga di comando. Puoi saperne di più su di loro su aka.ms/netstandardfaq e aka.ms/netcore .


Quanto sopra, insieme a una spiegazione molto chiara della maggior parte degli argomenti discussi in questa domanda, è disponibile nel seguente articolo estremamente utile di Microsoft (MSDN - Settembre 2017): .NET Standard - Demistificazione di .NET Core e .NET Standard


0

Intendevi .NET Framework? Perché lo standard .NET è un'implementazione, come .NET Framework, .NET Core e Xamarin.

Adoro .NET Core perché possiamo ospitarlo su Linux (utilizzare nginx nella mia esperienza). È diverso dal framework .NET, che è possibile ospitare solo su IIS. In questo caso puoi considerare l'hosting del budget (perché Windows Server è costoso per me).

Nella prospettiva dell'ambiente di sviluppo , il core .Net è leggero. Quindi, puoi usare VSCode, Sublime, per IDE (non solo Visual Studio).


0

In termini semplici, lo standard .NET viene utilizzato per la scrittura di progetti di librerie di classi che vengono compilati in dll. .NET Core può essere utilizzato per lo sviluppo di applicazioni Web effettive che possono essere eseguite su tutti i sistemi operativi (Windows, Linux, MacOS). (In .NET Core 3 Microsoft ha fornito la funzionalità per sviluppare app desktop tramite WPF, ma finora queste app non saranno multipiattaforma e funzioneranno solo su sistemi Windows. In futuro Microsoft potrebbe renderle anche multipiattaforma). NET standard librerie / dll possono essere utilizzate in qualsiasi applicazione che utilizza .NET (.NET framework, .NET Core), il che significa che è possibile utilizzare lo standard .NET con .NET framework e .NET core.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.