.NET Standard vs .NET Core

240

Eu li sobre a diferença entre o .NET Standard e o .NET Core, mas realmente não sei qual é a diferença ou quando escolher um projeto de biblioteca do .NET Standard e quando escolher um projeto de biblioteca do .NET Core.

Eu li que o .NET Standard é para garantir que um conjunto de APIs esteja sempre disponível, independentemente da plataforma usada (desde que essa plataforma seja compatível com a versão do .NET Standard que eu escolhi). Se não me engano, isso significa que posso criar uma biblioteca de classes do .NET Standard e usá-la em qualquer plataforma compatível com a versão do .NET Standard que eu escolhi.

Com o .NET Core, eu li que ele também se destina ao uso em várias plataformas; portanto, se eu escolher uma biblioteca do .NET Core, parece que também posso usá-lo em várias plataformas, assim como o .NET Standard.

Então, no final, não vejo a diferença. Quando devo usar qual? Qual a diferença entre eles?

Álvaro García
fonte
33
Em termos de código: .net standard = interface, .net core = class; se você codifica contra a classe, não consegue mais métodos (etc), mas está restrito a esse tipo concreto (e descendentes); se você usar a interface, poderá obter uma superfície menor, mas funcionará contra implementações arbitrárias ... desde que essas implementações façam o que é esperado :) sim, o núcleo .net tem como alvo várias plataformas, mas existem outras implementações de .net padrão
Marc Gravell
9
O .NETStandard é um substituto para o PCL. Uma Biblioteca de Classes Portátil o ajudou a escrever uma biblioteca que poderia ser executada em mais de uma plataforma (telefone, desktop, loja, navegador, xbox etc.). Não escalou muito bem, sofrendo muito com o n! problema, então eles abandonaram. O .NETCore é apenas a primeira estrutura que eles fizeram, foi a mais fácil, o restante precisa ser atualizado. Lembre-se de que isso é muito trabalho em andamento, grandes mudanças com o .NETStandard v2.0. O padrão para a todos governar, por agora :)
Hans Passant
Por favor, não adicione perguntas extras a uma já existente. Sua pergunta na edição é separada disso.
Jon Skeet
1
@ JonSkeet Então eu deveria abrir uma nova pergunta? Obrigado pelo conselho. porque, a princípio, eu abri uma nova pergunta sobre o multi-destino .net Core e fui derrotada porque eles disseram que é uma pergunta duplicada.
Álvaro García
@ ÁlvaroGarcía: Sim, mas deixe claro - sua pergunta atual de uma frase não está clara para mim.
Jon Skeet

Respostas:

195

Tentarei esclarecer melhor suas dúvidas e estender a resposta de Jon Skeet.

O .NET Standard é uma especificação , portanto, uma biblioteca compilada para uma versão específica do .NET Standard pode ser usada em diferentes implementações do .NET Standard.

Como dito no meu outro comentário, uma boa analogia para o relacionamento entre o .NET Standard e outras implementações do .NET Standard (.NET Core, .NET Framework, etc) é essa essência de David Fowler : As versões do .NET Standard são Interfaces, enquanto as estruturas são implementações dessas interfaces.

Este diagrama simplificado pode ajudar a entender esse relacionamento:

Analogia de interfaces padrão NET

Qualquer coisa de segmentação NetCore10tem acesso a INetStandard15APIs e APIs NetCore10 específicas (como DotNetHostPolicy).

Obviamente, essa biblioteca não pode ser usada em diferentes INetStandard15implementações ( NetCore10não é conversível em NetFramework462ou Mono46).

Se, em vez disso, necessidade acesso apenas a INetStandard15APIs (e alvo que especificação em vez de um quadro concreto) sua biblioteca pode ser usado por qualquer estrutura que implementa-lo ( NetCore10, NetFramework462, etc.)

Nota: na analogia original, David Fowler usou interfaces para versões do .NET Standard e implementações de estruturas. Acredito que o uso de interfaces e classes é, ao invés, mais intuitivo e representa melhor o relacionamento entre especificações e implementações concretas.

Federico Dipuma
fonte
2
Muito obrigado por isso. Mas tenho uma duvida. Se o padrão .net for uma interface e puder ser implementado, por exemplo, com o .net framework e o .net Core, quando crio uma biblioteca de classes padrão do .net e a uso em outro projeto, qual implementação está sendo usada, net framework ou .net Testemunho?
Álvaro García
8
Ele usará a implementação do aplicativo compilado (seja ele qual for). Se você compilar um aplicativo núcleo NET, em seguida, ele vai usar bibliotecas NET núcleo (que são uma implementação do padrão NET)
Federico Dipuma
5
Esse diagrama é uma ajuda fantástica para ilustrar a relação core / std / framework.
Jasper
Portanto, se eu criar um aplicativo de console net461 e direcionar uma biblioteca netstandard2.0, nada dessa lib padrão será resolvido no aplicativo de console. Assim... ??
Sinaesthetic
2
Uma imagem que mil palavras valem
Nikaas
182

O .NET Core é uma implementação do .NET Standard. Está disponível em vários sistemas operacionais, mas não é a mesma coisa - também existem outras implementações do .NET Standard.

Portanto, se você criar uma biblioteca .NET Core, ela terá acesso a itens implementados no .NET Core, mas não faz parte do .NET Standard, e sua biblioteca não será compatível com outras implementações do .NET Standard, como Xamarin, Tizen, estrutura de desktop .NET completa etc.

Em resumo: para obter a portabilidade máxima, faça com que sua biblioteca seja direcionada ao .NET Standard.

Jon Skeet
fonte
5
@ ÁlvaroGarcía: O que você quer dizer com "isso" deve ser compatível? .NET Core 1.0? Não necessariamente - porque o .NET Core 1.0 ainda pode incluir coisas extras . Essa entrada significa que, se você segmentar o .NET Standard 1.6, poderá executar o código no Mono 4.6 e no .NET Core 1.0.
Jon Skeet
4
Você não pode executar um assembly do .NET Core em nada que não seja o .NET Core (CoreCLR e CoreFX). Você pode executar um assembly do .NET Standard em qualquer estrutura que atenda às obrigações contratuais do padrão relevante (1.3, 1.6, 2.0, etc).
Mark Rendle
2
Plataforma cruzada refere-se ao sistema operacional, não à estrutura.
Mark Rendle
15
Como analogia, tente imaginar o .NET Standard como uma interface (por exemplo INetStandard16). O .NET Core 1.0 e o Mono 4.6 são implementados INetStandard16. Você não pode converter .Net Core 1.0 para Mono 4.6 (e vice-versa), mas qualquer coisa que use INetStandard16funcionará em ambos. (créditos para David Fowler )
Federico Dipuma
6
Isso me surpreendeu. Os nomes parecem invertidos. Você poderia pensar algo chamado "core" seria o mais minimalista dos dois ...
jpmc26
6

A biblioteca .NET Core Class é basicamente um subconjunto da biblioteca .NET Framework, que contém apenas menos APIs. A adesão à biblioteca do .NET Core Class dificulta o compartilhamento de código entre os tempos de execução. Esse código pode não funcionar para um tempo de execução diferente (Mono para Xamarin), porque não possui a API necessária. Para resolver isso, existe o .NET Standard, que é apenas um conjunto de especificações que informa quais APIs você pode usar . O principal objetivo do .NET Standard é compartilhar código entre tempos de execução. E é importante que essa especificação seja implementada em todos os tempos de execução. (.NET Framework, .NET Core e Mono para Xamarin).

Portanto, se você tiver certeza de que usará sua biblioteca apenas para projetos .NET Core, poderá ignorar o .NET Standard, mas se houver uma pequena chance de que seu código seja usado pelo .NET Framework ou Mono for Xamarin, é melhor aderir ao .NET Standard

Observe também que as versões superiores do .NET Standard contêm mais APIs, mas as versões inferiores são suportadas por mais plataformas. Portanto, se você criar uma biblioteca .NET Standard que deseja compartilhar entre os tempos de execução, segmente a versão mais baixa possível , o que ajuda a alcançar o maior número de plataformas. Por exemplo, se você deseja executar o .NET Framework 4.5 e o .NET Core 1.0, a versão mais alta do .NET Standard que você pode usar é o .NET Standard 1.1. Consulte esta excelente tabela da documentação para obter mais informações sobre ela.

PS: Além disso, se você deseja converter sua biblioteca para o .NET Standard, o .NET Portability Analyzer pode ajudá-lo.

user2771704
fonte
4

O .NET Standard é uma especificação das APIs do .NET destinadas a estar disponíveis nas implementações do .NET. Isso permite definir um conjunto uniforme de APIs BCL para todas as implementações do .NET.

O .NET Core é uma dessas implementações do .NET Standard. O .NET Framework é outra implementação do .NET Standard.

Imagem do .NET Blog

insira a descrição da imagem aqui

A resposta de Federicos fornece uma visão geral gráfica de como cada estrutura evolui com versões. Veja o diagrama abaixo do Microsoft Docs .

insira a descrição da imagem aqui

A segmentação do .NET Standard aumenta o suporte à plataforma, enquanto a segmentação de uma plataforma .NET específica, como o .NET Core (ou .NET Framework), permitirá que você use todos os recursos da plataforma.

Nipuna
fonte
2

O .NET Standard é uma especificação de APIs que todas as implementações do .NET devem fornecer. Ele traz consistência à família .NET e permite a criação de bibliotecas que você pode usar a partir de qualquer implementação .NET. Ele substitui PCLs para a construção de componentes compartilhados.

O .NET Core é uma implementação do .NET Standard otimizada para criar aplicativos de console, aplicativos da Web e serviços em nuvem usando o ASP.NET Core. Seu SDK vem com uma ferramenta poderosa que, além do desenvolvimento do Visual Studio, oferece suporte a um fluxo de trabalho de desenvolvimento completo baseado em linha de comando. Você pode aprender mais sobre eles em aka.ms/netstandardfaq e aka.ms/netcore .


O exposto acima, juntamente com uma explicação muito clara da maioria dos itens discutidos nesta pergunta, podem ser encontrados no seguinte artigo extremamente útil da Microsoft (MSDN - setembro de 2017): .NET Standard - Desmistificando o .NET Core e o .NET Standard

steliosalex
fonte
0

Você quis dizer .NET Framework? Porque o padrão .NET é uma implementação, como .NET Framework, .NET Core e Xamarin.

Eu amo o .NET Core porque podemos hospedá-lo no Linux (use o nginx na minha experiência). É diferente do .NET Framework, que você só pode hospedar no IIS. Você pode considerar o orçamento de hospedagem neste caso (porque o servidor Windows é caro para mim).

Na perspectiva do ambiente de desenvolvimento , o núcleo .Net é leve. Portanto, você pode usar o VSCode, Sublime, para IDE (não apenas o visual studio).

Fityan Aula
fonte
0

Em termos simples, o padrão .NET é usado para escrever projetos de bibliotecas de classes que são compilados em dll. O .NET Core pode ser usado para desenvolver aplicativos da Web reais que podem ser executados em todos os sistemas operacionais (Windows, Linux, MacOS). (No .NET Core 3, a Microsoft fornece a funcionalidade para desenvolver aplicativos de desktop usando o WPF, mas agora esses aplicativos não serão multiplataforma e serão executados apenas no sistema Windows. No futuro, a Microsoft poderá torná-los entre plataformas também) bibliotecas / dlls podem ser usadas em qualquer aplicativo que use .NET (.NET framework, .NET Core), o que significa que você pode usar o .NET standard com o .NET Framework e o .NET core.

Waleed Naveed
fonte