framework - Qual é a diferença entre os tipos de projeto.NET Core e.NET Standard Class Library?



.net core vs.net standard (7)

No Visual Studio, existem pelo menos três tipos diferentes de biblioteca de classes que você pode criar:

  • Biblioteca de Classes (.NET Framework)
  • Biblioteca de Classes (.NET Standard)
  • Biblioteca de Classes (.NET Core)

Enquanto o primeiro é o que temos usado há anos, um grande ponto de confusão que tenho tido é quando usar os tipos de biblioteca de classes .NET Standard e .NET Core. Eu tenho sido mordido por isso recentemente ao tentar multi-alvo diferentes versões de framework e criar um projeto de teste de unidade .

Então, qual é a diferença entre a Biblioteca de Classes (.NET Standard) e a Biblioteca de Classes (.NET Core) , por que ambos existem e quando devemos usar um sobre o outro?

https://ffff65535.com


Quando devemos usar um sobre o outro?

A decisão é uma troca entre compatibilidade e acesso à API.

Use uma biblioteca .NET Standard quando quiser aumentar o número de aplicativos que serão compatíveis com sua biblioteca, e você pode reduzir a área de superfície da API .NET que sua biblioteca pode acessar.

Use uma biblioteca .NET Core quando quiser aumentar a área de superfície da API .NET que sua biblioteca pode acessar, e você pode permitir que somente aplicativos .NET Core sejam compatíveis com sua biblioteca.

Por exemplo, uma biblioteca que tenha como alvo o .NET Standard 1.3 será compatível com aplicativos que tenham como alvo o .NET Framework 4.6, o .NET Core 1.0, a Plataforma Universal do Windows 10.0 e qualquer outra plataforma que suporte o .NET Standard 1.3. A biblioteca não terá acesso a algumas partes da API .NET, no entanto. Por exemplo, o pacote Microsoft.NETCore.CoreCLR é compatível com o .NET Core, mas não com o .NET Standard.

Qual é a diferença entre a Biblioteca de Classes (.NET Standard) e a Biblioteca de Classes (.NET Core)?

A seção de estruturas baseadas em pacote descreve a diferença.

Compatibilidade: As bibliotecas que se destinam ao .NET Standard serão executadas em qualquer tempo de execução compatível com o .NET Standard, como .NET Core, .NET Framework, Mono / Xamarin. Por outro lado, as bibliotecas que visam o .NET Core só podem ser executadas no tempo de execução do .NET Core.

Área de superfície da API: .NET As bibliotecas padrão vêm com tudo no NETStandard.Library enquanto as bibliotecas do .NET Core vêm com tudo no Microsoft.NETCore.App . O último inclui aproximadamente 20 bibliotecas adicionais, algumas das quais podemos adicionar manualmente à nossa biblioteca .NET Standard (como System.Threading.Thread ) e algumas das quais não são compatíveis com o padrão .NET (como Microsoft.NETCore.CoreCLR ).

Além disso, as bibliotecas .NET Core especificam um tempo de execução e vêm com um modelo de aplicativo. Isso é importante, por exemplo, para tornar as bibliotecas de classes de teste de unidade executáveis.

Por que ambos existem?

Ignorando as bibliotecas por um momento, a razão pela qual o .NET Standard existe é para portabilidade; define um conjunto de APIs que as plataformas .NET aceitam implementar. Qualquer plataforma que implemente um .NET Standard é compatível com bibliotecas que visam esse .NET Standard. Uma dessas plataformas compatíveis é o .NET Core.

Voltando às bibliotecas, os modelos de biblioteca .NET Standard existem para serem executados em vários tempos de execução (às custas da área de superfície da API). Obversamente, os modelos de biblioteca .NET Core existem para acessar mais área de superfície da API (às custas da compatibilidade) e para especificar uma plataforma na qual construir um executável.


.NET Standard: Pense nisso como uma grande biblioteca padrão. Ao usar isso como uma dependência, você só pode criar bibliotecas (.DLLs), não executáveis. Uma biblioteca feita com o padrão .NET como uma dependência pode ser adicionada a um Xamarin.Android, um Xamarin.iOS, um projeto .NET Core Windows / OSX / Linux.

.NET Core: Pense nisso como a continuação do antigo .NET framework, apenas o opensource e algumas coisas ainda não foram implementadas e outras foram descontinuadas. Ele estende o padrão .NET com funções extras, mas é executado apenas em desktops. Ao adicionar isso como uma dependência, você pode criar aplicativos executáveis ​​no Windows, Linux e OSX. (Embora console apenas por enquanto, sem GUIs). Portanto, .NET Core = .NET Standard + Material específico para desktop.
O UWP também o utiliza e o novo núcleo ASP.NET também o utiliza como dependência.


As respostas acima podem descrever a melhor compreensão sobre a diferença entre o núcleo líquido, o padrão líquido e o enquadramento líquido, então eu só quero compartilhar minha experiência ao escolher isso ao longo do tempo.

No projeto, você precisa mesclar o .NET Framework, o .NET Core e o .NET Standard. Por exemplo, no momento em que criamos o sistema com o .NET Core 1.0, não há suporte para o Windows Services que hospeda o núcleo .net.

O próximo motivo é que estávamos usando o Active Report, que não suporta o .NET Core. Por isso, queremos criar uma biblioteca de infra-estrutura que possa ser usada tanto para o .NET Core (núcleo asp.net) quanto para o Serviço e Relatório do Windows (.NET Framework) -> É por isso que escolhemos o .NET Standard para esse tipo de biblioteca. Escolher o padrão .NET significa que você precisa considerar com cuidado cada classe na biblioteca deve ser simples e cruzada. NET (core, framework, standard).

Conclusão:

  • .NET Standard para a biblioteca de infraestrutura e compartilhada comum. Essa lib pode ser referenciada pelo .NET Framework e .NET Core.
  • .NET Framework para tecnologias não suportadas, como o Active Report, o Windows Services (agora com o .NET 3.0 ele suporta).
  • .NET Core para ASP.NET Core, é claro.

A Microsoft acaba de anunciar o .NET 5: https://devblogs.microsoft.com/dotnet/introducing-net-5/


Então a resposta curta seria:

IAnimal == .NetStandard (General)
ICat == .NetCore (Less General)
IDog == .NetFramework (Specific / oldest and has the most features)

O .Net Standard existe principalmente para melhorar o compartilhamento de código e tornar as APIs disponíveis em cada implementação .Net mais consistente.

Enquanto criamos Bibliotecas, podemos ter como alvo o padrão .Net Standard 2.0 para que a biblioteca criada seja compatível com diferentes versões do .Net Framework, incluindo .Net Core, Mono ..


Outra maneira de explicar a diferença pode ser com exemplos do mundo real, já que a maioria de nós, mortais, usará ferramentas e estruturas existentes (Xamarin, Unity, etc) para fazer o trabalho.

Portanto, com o .NET Framework, você tem todas as ferramentas do .NET para trabalhar, mas só pode segmentar aplicativos do Windows (UWP, WinForms, ASP.NET, etc). Como o .NET Framework é de código fechado, não há muito o que fazer.

Com o .NET Core, você tem menos ferramentas, mas pode segmentar as principais plataformas de desktop (Windows, Linux, Mac). Isso é especialmente útil em aplicativos ASP.NET Core, já que agora você pode hospedar o Asp.net no Linux (preços de hospedagem mais baratos). Agora, como o .NET Core era de código aberto, é tecnicamente possível desenvolver bibliotecas para outras plataformas. Mas como não há frameworks que o suportem, não acho que seja uma boa ideia.

Com o .NET Standard você tem ainda menos ferramentas, mas você pode segmentar todas as plataformas. Você pode segmentar o celular graças ao Xamarin, e você pode até mesmo direcionar os consoles de jogos graças ao Mono / Unity.

Em um aplicativo do mundo real, você pode precisar usar todos eles. Por exemplo, desenvolvi um aplicativo de ponto de venda que tinha a seguinte arquitetura:

Compartilhado Servidor e Cliente:

  • Uma biblioteca padrão do .NET que manipula os modelos do meu aplicativo.

Como é uma biblioteca padrão do .NET, ela pode ser usada em qualquer outra biblioteca.

Lado do servidor (API da Web):

  • Uma biblioteca .NET Standard (também pode ser Core) que lida com todas as conexões de banco de dados.

  • Um projeto .NET Core que manipula a API Rest e faz uso da biblioteca de banco de dados.

Como isso é desenvolvido no .NET Core, eu posso hospedar o aplicativo em um servidor Linux.

Lado do Cliente (MVVM com WPF + Xamarin.Forms Android / IOS):

  • Uma biblioteca padrão do .NET que manipula a conexão da API do cliente.

  • Uma biblioteca padrão do .NET que manipula a lógica ViewModels. Usado em todas as visualizações.

  • Um aplicativo WPF do .NET Framework que manipula as exibições do WPF para um aplicativo do Windows.

  • Uma biblioteca padrão do .NET que manipula modos de exibição Xamarin Forms.

  • Um projeto Xamarin Android e Xamarin IOS.

Assim, você pode ver que há uma grande vantagem aqui no lado do cliente do aplicativo, pois posso reutilizar as bibliotecas .NET Standard (Client API e ViewModels) e apenas fazer visualizações sem lógica para os aplicativos WPF, Xamarin e IOS.


.Net Framework e .Net Core são duas implementações diferentes do tempo de execução .Net. O Core e o Framework (mas especialmente o Framework) têm perfis diferentes que incluem seleções maiores ou menores (ou simplesmente diferentes) das muitas APIs e assemblies que a Microsoft criou para .Net, dependendo de onde eles estão instalados e em qual perfil. Por exemplo, existem algumas APIs diferentes disponíveis nos aplicativos Universais do Windows do que no perfil "normal" do Windows. Mesmo no Windows, você pode ter o perfil "Cliente" versus o perfil "Completo". Além disso, existem outras implementações (como o Mono) que possuem seus próprios conjuntos de bibliotecas.

.Net Standard é uma especificação para a qual conjuntos de bibliotecas de API e assemblies devem estar disponíveis. Um aplicativo criado para o .Net Standard 1.0 deve ser capaz de compilar e executar qualquer versão do Framework, Core, Mono, etc, que anuncie o suporte para a coleção de bibliotecas .Net Standard 1.0. Semelhante é verdadeiro para .Net Standard 1.1, 1.5, 1.6, 2.0, etc. Desde que o tempo de execução forneça suporte para a versão do Standard direcionada por seu programa, seu programa deve ser executado nele.

Um projeto destinado a uma versão do Standard não poderá utilizar recursos que não estejam incluídos nessa revisão do padrão. Isso não significa que você não possa aceitar dependências de outros assemblies ou APIs publicadas por outros fornecedores (por exemplo, itens no NuGet). Mas isso significa que quaisquer dependências que você tomar também devem incluir suporte para sua versão do .Net Standard. O .Net Standard está evoluindo rapidamente, mas ainda é novo o suficiente e se preocupa o suficiente com alguns dos menores perfis de tempo de execução, que essa limitação pode parecer sufocante. (Observe um ano e meio depois: isso está começando a mudar e versões recentes do .Net Standard são muito melhores e mais completas).

Por outro lado, um aplicativo destinado ao Standard deve ser usado em mais situações de implantação, já que, em teoria, ele pode ser executado com Core, Framework, Mono etc. Para um projeto de biblioteca de classes que busca ampla distribuição, essa é uma promessa atraente . Para um projeto de biblioteca de classes usado principalmente para fins internos, pode não ser uma preocupação tão grande.

O .Net Standard também pode ser útil em situações em que a equipe do SysAdmin está querendo passar do ASP.Net no Windows para o ASP.Net para o .Net Core no Linux por razões filosóficas ou de custo, mas a equipe de Desenvolvimento deseja continuar trabalhando contra o .Net Framework no Visual Studio no Windows.





.net-standard