.NET Standard

.Net Standard é uma especificação formal das APIs do .NET que estão disponíveis em várias implementações do .net. A motivação por trás da .NET Standard era estabelecer uma maior uniformidade no ecossistema do .NET. No entanto, o .NET 5 adota uma abordagem diferente para estabelecer a uniformidade, e essa nova abordagem elimina a necessidade de .NET Standard em muitos cenários. Para obter mais informações, consulte .NET 5 e .net Standard mais adiante neste artigo.

Suporte à implementação do .NET

As diversas implementações do .NET se destinam a versões específicas do .NET Standard. Cada versão de implementação do .NET anuncia a versão mais alta do .NET Standard a qual ela dá suporte, uma afirmação que significa que também há suporte para versões anteriores. por exemplo, .NET Framework 4,6 implementa .NET Standard 1,3, o que significa que ele expõe todas as APIs definidas em .NET Standard versões 1,0 a 1,3. da mesma forma, .NET Framework 4.6.1 implementa .NET Standard 1,4, enquanto o .net 5 implementa .NET Standard 2,1.

A tabela a seguir lista as versões mínimas de implementação que oferecem suporte a cada versão de .net Standard. Isso significa que as versões posteriores de uma implementação listada também oferecem suporte à versão de .NET Standard correspondente. Por exemplo, o .NET Core 2,1 e versões posteriores dão suporte a .NET Standard 2,0 e versões anteriores.

.NET Standard 1.0 1.1 1.2 1,3 1,4 1,5 1,6 2.0 2.1
.NET 5,0 5,0 5,0 5,0 5,0 5,0 5,0 5,0 5,0
.NET Core 1.0 1.0 1.0 1.0 1.0 1.0 1.0 2,0 3.0
.NET Framework 1 4.5 4.5 4.5.1 4.6 4.6.1 4.6.1 2 4.6.1 2 4.6.1 2 N/A3
Mono 4.6 4.6 4.6 4.6 4.6 4.6 4.6 5.4 6.4
Xamarin.iOS 10.0 10.0 10.0 10.0 10.0 10.0 10.0 10.14 12.16
Xamarin.Mac 3,0 3,0 3,0 3,0 3,0 3,0 3,0 3.8 5.16
Xamarin.Android 7,0 7,0 7,0 7,0 7,0 7,0 7,0 8.0 10.0
Plataforma Universal do Windows 10.0 10.0 10.0 10.0 10.0 10.0.16299 10.0.16299 10.0.16299 TBD
Unity 2018.1 2018.1 2018.1 2018.1 2018.1 2018.1 2018.1 2018.1 2021,2

1 as versões listadas para .NET Framework se aplicam ao SDK do .net Core 2,0 e às versões posteriores das ferramentas. As versões mais antigas usaram um mapeamento diferente para .NET Standard 1,5 e superior. você pode baixar ferramentas para o .net Core tools para Visual Studio 2015 se não for possível atualizar para o Visual Studio 2017 ou uma versão posterior.

2 as versões listadas aqui representam as regras que o NuGet usa para determinar se uma determinada biblioteca de .NET Standard é aplicável. embora NuGet considere .NET Framework 4.6.1 como suporte .NET Standard 1,5 a 2,0, há vários problemas com o consumo de bibliotecas .NET Standard criadas para essas versões de projetos .NET Framework 4.6.1. para projetos .NET Framework que precisam usar essas bibliotecas, recomendamos que você atualize o projeto para o destino .NET Framework 4.7.2 ou superior.

3 .NET Framework não dá suporte a .NET Standard 2,1. Para obter mais informações, consulte o anúncio do .NET Standard 2,1.

  • As colunas representam versões do .NET Standard. Cada célula de cabeçalho é um link para um documento que mostra quais APIs foram adicionadas a essa versão do .NET Standard.
  • As linhas representam as diferentes implementações do .NET.
  • O número de versão em cada célula indica a versão mínima da implementação de que você precisará para direcionar essa versão do .NET Standard.
  • Para obter uma tabela interativa, consulte Versões do .NET Standard.

Para localizar a versão mais recente do .NET Standard para a qual você pode direcionar, siga estas etapas:

  1. Localize a linha que indica a implementação do .NET na qual você deseja executar.
  2. Localize a coluna nessa linha que indica sua versão, da direita para a esquerda.
  3. O cabeçalho da coluna indica a versão do .NET Standard compatível com o destino. Você também pode ter como destino qualquer versão inferior do .NET Standard. Versões superiores do .NET Standard também darão suporte à implementação.
  4. Repita esse processo para cada plataforma de destino. Se você tiver mais de uma plataforma de destino, escolha a versão menos recente entre elas. por exemplo, se você deseja executar o .NET Framework 4,8 e o .net 5, a versão mais alta .NET Standard que você pode usar é .NET Standard 2,0.

Para qual versão do .NET Standard direcionar

Recomendamos que você direcione o .NET Standard 2,0, a menos que você precise dar suporte a uma versão anterior. A maioria das bibliotecas de uso não deve precisar de APIs fora do .NET Standard 2.0. O .NET standard 2.0 é compatível com todas as plataformas modernas e é a maneira recomendada de dar suporte a várias plataformas com um destino.

Se você precisar dar suporte a .NET Standard 1. x, recomendamos que você também direcione .net Standard 2,0. O .NET standard 1.x é distribuído como um conjunto granular de pacotes do NuGet, que cria um grande grafo de dependência de pacote e resulta em os desenvolvedores baixarem muitos pacotes durante o build. Para obter mais informações, consulte direcionamento de plataforma cruzada e .net 5 e .net Standard mais adiante neste artigo.

Regras de controle de versão do .NET Standard

Há duas regras principais de controle de versão:

  • Aditivo: as versões do .NET Standard são círculos logicamente concêntricos: versões mais recentes incorporam todas as APIs das versões anteriores. Não há alterações interruptivas entre as versões.
  • Imutável: após o envio, as versões do .NET Standard serão congeladas.

Não haverá nenhuma nova versão do .NET Standard após 2,1. Para obter mais informações, consulte .NET 5 e .net Standard mais adiante neste artigo.

Especificação

A especificação do .NET Standard é um conjunto padronizado de APIs. a especificação é mantida por implementadores do .net, especificamente a Microsoft (inclui .NET Framework, .net Core e Mono) e o Unity.

Artefatos oficiais

A especificação oficial é um conjunto de arquivos . cs que definem as APIs que fazem parte do padrão. O diretório ref em dotnet/standard repository define as APIs do .NET Standard.

O metapacote NETStandard.Library (de origem) descreve o conjunto de bibliotecas que define (parcialmente) uma ou mais versões do .NET Standard.

Um componente específico, como o System.Runtime, descreve:

  • Parte do .NET Standard (apenas seu escopo).
  • Várias versões do .NET Standard, para esse escopo.

Artefatos derivados são fornecidos para habilitar leitura mais conveniente e permitir determinados cenários do desenvolvedor (por exemplo, usando um compilador).

Representação de pacote

O meio de distribuição principal dos assemblies de referência do .NET Standard são os pacotes NuGet. As implementações são entregues de várias formas, apropriadas para cada implementação do .NET.

Pacotes NuGet são direcionados a uma ou mais estruturas. .NET Standard pacotes visam a estrutura ".NET Standard". Você pode direcionar a estrutura de .NET Standard usando o netstandard Compact TFM (por exemplo, netstandard1.4 ). As bibliotecas que se destinam a serem executadas em várias implementações do .NET devem ter como destino essa estrutura. Para obter o mais amplo conjunto de APIs, direcione netstandard2.0, pois o número de APIs disponíveis mais do que dobrou entre o .NET Standard 1.6 e 2.0.

o NETStandard.Library metapacote faz referência ao conjunto completo de pacotes de NuGet que definem .NET Standard. A maneira mais comum de direcionar para netstandard é fazer referência a esse metapacote. Ele descreve e fornece acesso às ~40 bibliotecas .NET e APIs associadas, que definem a .NET Standard. Você pode referenciar pacotes adicionais destinados a netstandard para obter acesso a APIs adicionais.

Controle de versão

A especificação não é singular, mas um conjunto de APIs com controle de versão linear. A primeira versão do padrão estabelece um conjunto de linhas de base de APIs. As versões subsequentes adicionam APIs e herdam APIs definidas por versões anteriores. Não há nenhum provisionamento estabelecido para remover APIs do padrão.

.NET Standard não é específico de uma implementação .NET, nem corresponde ao esquema de controle de versão de qualquer uma dessas implementações.

Conforme observado anteriormente, não haverá novas versões de .NET Standard após 2,1.

.NET Standard de destino

Você pode criar bibliotecas de .net Standard usando uma combinação da netstandard estrutura e do NETStandard.Library metapacote.

Modo de compatibilidade do .NET framework

O modo de compatibilidade do .NET Framework foi introduzido a partir do .NET Standard 2.0. Esse modo de compatibilidade permite que os projetos do .NET Standard referenciem as bibliotecas do .NET Framework como se elas fossem compiladas para o .NET Standard. Fazer referência a bibliotecas do .NET Framework não funciona para todos os projetos, como as bibliotecas que usam APIs do WPF (Windows Presentation Foundation).

Para obter mais informações, veja .NET Framework compatibility mode (Modo de compatibilidade do .NET Framework).

Bibliotecas do .NET standard e Visual Studio

para criar .NET Standard bibliotecas no Visual Studio, verifique se você tem Visual Studio 2019 ou Visual Studio 2017 versão 15,3 ou posterior instalado em Windows ou Visual Studio para Mac versão 7,1 ou posterior instalada no macOS.

Se você precisar apenas consumir as bibliotecas do .NET Standard 2.0 em seus projetos, também será possível fazer isso no Visual Studio 2015. No entanto, é necessário ter o NuGet cliente 3.6 ou posterior instalado. É possível baixar o cliente do NuGet para Visual Studio 2015 na página downloads do NuGet.

.NET 5 e .NET Standard

O .NET 5 é a implementação do .NET que a Microsoft está desenvolvendo ativamente. é um único produto com um conjunto uniforme de recursos e APIs que podem ser usados para Windows aplicativos de área de trabalho e aplicativos de console entre plataformas, serviços de nuvem e sites. Os TFMs do .NET 5 refletem essa ampla variedade de cenários:

  • net5.0

    Esse TFM é para o código que é executado em todos os lugares. Com algumas exceções, ele inclui apenas tecnologias que funcionam entre plataformas. Para o código do .NET 5, net5.0 substitui netcoreapp e netstandard TFMs.

  • net5.0-windows

    Este é um exemplo de TFMs específicas do sistema operacional que adicionam funcionalidade específica do sistema operacional a tudo o que net5.0 se refere.

Quando direcionar para NET 5.0 versus netstandard

Para o código existente que tem netstandard como alvo, não há necessidade de alterar o TFM para net5.0 . O .NET 5 implementa .NET Standard 2,1 e anteriores. O único motivo para redirecionar de .NET Standard para o .NET 5 seria obter acesso a mais recursos de tempo de execução, recursos de linguagem ou APIs. Por exemplo, para usar o C# 9, você precisa ter como destino o .NET 5. Você pode realizar multidirecionar o .NET 5 e .NET Standard para obter acesso aos recursos mais recentes e ainda ter sua biblioteca disponível para outras implementações do .NET.

Aqui estão algumas diretrizes para o novo código para o .NET 5:

  • Componentes do aplicativo

    Se você estiver usando bibliotecas para dividir um aplicativo em vários componentes, recomendamos que você direcione net5.x onde 5.x é a versão mais antiga do .NET 5 que seu aplicativo pode atingir. Para simplificar, é melhor manter todos os projetos que compõem seu aplicativo na mesma versão do .NET. Em seguida, você pode assumir os mesmos recursos da BCL em todos os lugares.

  • Bibliotecas reutilizáveis

    se você estiver criando bibliotecas reutilizáveis que planeja enviar em NuGet, considere o compensador entre o alcance e o conjunto de recursos disponíveis. .NET Standard 2,0 é a versão mais recente com suporte do .NET Framework, portanto, ele fornece um bom alcance com um conjunto de recursos muito grande. Não é recomendável direcionar .NET Standard 1. x, pois você limitaria o conjunto de recursos disponíveis para um aumento mínimo no alcance.

    se você não precisar dar suporte a .NET Framework, poderá ir .NET Standard 2,1 ou .net 5. Recomendamos que você pule .NET Standard 2,1 e vá direto para o .NET 5. As bibliotecas mais amplamente usadas acabarão com vários destinos para .NET Standard 2,0 e para o .NET 5. O suporte ao .NET Standard 2,0 oferece o máximo de alcance, enquanto o suporte ao .NET 5 garante que você possa aproveitar os recursos mais recentes da plataforma para os clientes que já estão no .NET 5.

Problemas de .NET Standard

Aqui estão alguns problemas com .NET Standard que ajudam a explicar por que o .NET 5 é a melhor maneira de compartilhar código entre plataformas e cargas de trabalho:

  • Lentidão para adicionar novas APIs

    .NET Standard foi criado como um conjunto de API que todas as implementações do .NET teriam de dar suporte, portanto, havia um processo de revisão para que as propostas adicionassem novas APIs. O objetivo era padronizar apenas as APIs que poderiam ser implementadas em todas as plataformas .NET atuais e futuras. O resultado foi que, se um recurso perdeu uma versão específica, talvez seja necessário aguardar alguns anos antes que ele tenha sido adicionado a uma versão do padrão. Em seguida, você esperaria mais tempo para que a nova versão do .NET Standard seja amplamente suportada.

    Solução no .NET 5: Quando um recurso é implementado, ele já está disponível para cada aplicativo e biblioteca do .NET 5, pois a base de código é compartilhada. E, como não há nenhuma diferença entre a especificação da API e sua implementação, você pode aproveitar os novos recursos muito mais rapidamente do que com .NET Standard.

  • Controle de versão complexo

    A separação da especificação de API de suas implementações resulta em um mapeamento complexo entre versões de especificação de API e versões de implementação. Essa complexidade é evidente na tabela mostrada anteriormente neste artigo e as instruções sobre como interpretá-la.

    Solução no .NET 5: Não há nenhuma separação entre uma especificação de API do .NET 5. x e sua implementação. O resultado é um esquema TFM simplificado. Há um prefixo TFM para todas as cargas de trabalho: net5.0 é usado para bibliotecas, aplicativos de console e aplicativos Web. A única variação é um sufixo que especifica APIs específicas da plataforma para uma plataforma específica, como net5.0-windows . Graças a essa Convenção de nomenclatura TFM, você pode facilmente dizer se um determinado aplicativo pode usar uma determinada biblioteca. Nenhuma tabela equivalente de número de versão como a de .NET Standard é necessária.

  • Plataforma-exceções sem suporte em tempo de execução

    O .NET Standard expõe APIs específicas da plataforma. Seu código pode ser compilado sem erros e parece ser portável a qualquer plataforma, mesmo que não seja portátil. Quando ele é executado em uma plataforma que não tem uma implementação para uma determinada API, você obtém erros de tempo de execução.

    Solução no .NET 5: O SDK do .NET 5 inclui analisadores de código que são habilitados por padrão. O analisador de compatibilidade de plataforma detecta o uso não intencional de APIs que não têm suporte nas plataformas nas quais você pretende executar. Para obter mais informações, consulte analisador de compatibilidade de plataforma.

.NET Standard não preterido

.NET Standard ainda é necessário para as bibliotecas que podem ser usadas por várias implementações do .NET. É recomendável que você direcione .NET Standard nos seguintes cenários:

  • Use netstandard2.0 para compartilhar código entre .NET Framework e todas as outras implementações do .net.
  • Use netstandard2.1 para compartilhar código entre o mono, o Xamarin e o .NET Core 3. x.

Confira também