.NET Standard contro .NET Core
Ho letto della differenza tra .NET Standard e .NET Core, ma davvero non so 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 serve a garantire che un set di API sia sempre disponibile, indipendentemente dalla piattaforma utilizzata (purché quella piattaforma sia compatibile con la versione .NET Standard che ho scelto). Se non sbaglio, significa che posso creare una libreria di classi di .NET Standard e quindi utilizzarla su qualsiasi piattaforma compatibile con la versione .NET Standard che ho scelto.
Con .NET Core, ho letto che è inteso anche per l'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?
Risposte
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 di .NET Standard può essere utilizzata in diverse implementazioni di .NET Standard.
Come detto in un altro mio commento, una buona analogia per la relazione tra .NET Standard e altre implementazioni .NET Standard (.NET Core, .NET Framework, ecc.) È questa sintesi di David Fowler : le versioni .NET Standard lo sono Interfaces, mentre i framework lo sono implementazioni di queste interfacce.
Questo diagramma semplificato può aiutare a capire questa relazione:
Qualsiasi cosa mirare NetCore10ha accesso ad INetStandard15API e API NetCore10 specifiche (come DotNetHostPolicy).
Ovviamente 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 interfacce sia per le versioni .NET Standard che per le implementazioni dei framework. Credo che l'utilizzo di interfacce e classi sia, invece, più intuitivo e rappresenti meglio il rapporto tra specifiche e implementazioni concrete.
.NET Core è un'implementazione di .NET Standard. È disponibile su più sistemi operativi, ma non è la stessa cosa: ci sono anche altre implementazioni di .NET Standard.
Quindi, se crei una libreria .NET Core, avrà accesso a cose che sono 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à, fai in modo che la tua libreria sia target .NET Standard.
.NET Standard è una specifica delle API .NET destinata a essere disponibile nelle 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 .NET
La risposta di Federicos ti offre una panoramica grafica di come ogni framework si evolve con le versioni. Dai un'occhiata al diagramma sottostante da Microsoft Docs .
Il targeting di .NET Standard aumenta il supporto della 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.
La libreria di classi .NET Core è fondamentalmente un sottoinsieme della libreria .NET Framework, che contiene solo meno API. Attenersi alla libreria di classi .NET Core rende difficile condividere il codice tra i runtime. Questo codice potrebbe non funzionare per un runtime diverso (Mono per Xamarin), perché non dispone dell'API di cui hai bisogno. Per risolvere questo problema 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 runtime. (.NET Framework, .NET Core e Mono per Xamarin).
Quindi, se sei sicuro di utilizzare la tua libreria solo per i progetti .NET Core, puoi ignorare .NET Standard, ma se c'è anche una minima possibilità che il tuo codice venga usato da .NET Framework o Mono per Xamarin, allora è meglio per attenersi a .NET Standard
Si noti inoltre che le versioni successive di .NET Standard contengono più API, ma le versioni inferiori sono supportate da più piattaforme. Pertanto, se crei una libreria .NET Standard che desideri condividere tra i runtime, scegli come target la versione più bassa possibile , il che ti aiuta a raggiungere la maggior parte delle piattaforme. Ad esempio, se si desidera eseguire su .NET Framework 4.5 e .NET Core 1.0, la versione più recente di .NET Standard che è possibile utilizzare è .NET Standard 1.1. Fare riferimento a questa fantastica tabella dalla documentazione per maggiori informazioni a riguardo.
PS: Inoltre, se desideri convertire la tua libreria in .NET Standard, .NET Portability Analyzer potrebbe aiutarti in questo.
.NET Standard è una specifica delle API che tutte le implementazioni .NET devono fornire. Porta coerenza alla famiglia .NET e consente di creare librerie utilizzabili da qualsiasi implementazione .NET. Sostituisce i PCL per la creazione di componenti condivisi.
.NET Core è un'implementazione di .NET Standard ottimizzata per la creazione di applicazioni console, app Web e servizi cloud tramite ASP.NET Core. Il suo SDK è dotato di potenti strumenti 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 delle cose discusse in questa domanda, può essere trovato nel seguente articolo estremamente utile di Microsoft (MSDN - settembre 2017): .NET Standard - Demystifying .NET Core and .NET Standard
In termini semplici, lo standard .NET viene utilizzato per scrivere 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 utilizzando WPF, ma fino ad ora queste app non saranno multipiattaforma e funzioneranno solo su sistema Windows. In futuro Microsoft potrebbe renderle anche multipiattaforma) .NET standard le librerie / dll possono essere utilizzate in qualsiasi applicazione che utilizza .NET (.NET framework, .NET Core), il che significa che è possibile utilizzare .NET standard con .NET framework e .NET core.
Volevi dire .NET Framework? Poiché .NET standard è un'implementazione, come .NET Framework, .NET Core e Xamarin.
Amo .NET Core perché possiamo ospitarlo su Linux (usa nginx nella mia esperienza). È diverso da .NET Framework che puoi ospitare solo su IIS. Puoi considerare il budget di hosting in questo caso (perché il server Windows è costoso per me).
Nella prospettiva dell'ambiente di sviluppo , .Net core è leggero. Quindi, puoi usare VSCode, Sublime, per IDE (non solo visual studio).