.NET Standard

O .NET Standard é uma especificação formal de APIs do .NET que estão disponíveis em todas as implementações do .NET. A motivação por trás do .NET Standard era estabelecer maior uniformidade no ecossistema do .NET. O .NET 5 e versões posteriores adotam uma abordagem diferente para estabelecer a uniformidade que elimina a necessidade do .NET Standard na maioria dos cenários. No entanto, se você quiser compartilhar código entre .NET Framework e qualquer outra implementação do .NET, como o .NET Core, sua biblioteca deverá ter como destino o .NET Standard 2.0. Nenhuma nova versão do .NET Standard será lançada, mas o .NET 5 e todas as versões posteriores continuarão dando suporte ao .NET Standard 2.1 e versões anteriores.

Para obter informações sobre como escolher entre o .NET 5+ e o .NET Standard, confira .NET 5+ e .NET Standard mais adiante neste artigo.

Versões do .NET Standard

O .NET Standard tem controle de versão. Cada nova versão adiciona mais APIs. Quando uma biblioteca é criada em relação a uma determinada versão do .NET Standard, ela pode ser executada em qualquer implementação do .NET que implemente essa versão do .NET Standard (ou superior).

Ter como alvo uma versão mais alta do .NET Standard permite que uma biblioteca use mais APIs, mas ela só poderá ser usada em versões mais recentes do .NET. Ter como alvo uma versão inferior reduz as APIs disponíveis, mas a biblioteca poderá ser executada em mais lugares.

Selecione a versão do .NET Standard

O .NET Standard 1.0 tem 7.949 das 37.118 APIs disponíveis.

Implementação do .NET Suporte à versão
.NET e .NET Core 1.0, 1.1, 2.0, 2.1, 2.2, 3.0, 3.1, 5.0, 6.0, 7.0, 8.0
.NET Framework 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
Mono 4.6, 5.4, 6.4
Xamarin.iOS 10.0, 10.14, 12.16
Xamarin.Mac 3.0, 3.8, 5.16
Xamarin.Android 7.0, 8.0, 10.0
Plataforma Universal do Windows 8.0, 8.1, 10.0, 10.0.16299, a ser determinado
Unity 2018.1

Para mais informações, confira .NET Standard 1.0. Para obter uma tabela interativa, consulte Versões do .NET Standard.

Para qual versão do .NET Standard direcionar

Recomendamos que você tenha como destino o .NET Standard 2.0, a menos que 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 ao .NET Standard 1.x, recomendamos que você também tenha como destino o .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 mais informações, confira Direcionamento multiplataforma e .NET 5+ e .NET Standard posteriormente 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á novas versões do .NET Standard após a 2.1. Para mais informações, confira .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 Microsoft (inclui o .NET Framework, .NET Core e Mono) e 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 no (agora arquivado) repositório dotnet/standard 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. Os pacotes do .NET Standard são direcionados à estrutura do ".NET Standard". É possível direcionar a estrutura do .NET Standard usando o netstandardTFM compacto (por exemplo, netstandard1.4). Bibliotecas destinadas à execução em várias implementações do .NET devem ter essa estrutura como destino. 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 metapacote NETStandard.Library faz referência ao conjunto completo de pacotes NuGet que definem o .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 é única, mas um conjunto com controle de versão linear de APIs. 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á nenhuma provisão estabelecida para a remoção de APIs do Standard.

O .NET Standard não é específico a nenhuma implementação do .NET, nem corresponde ao esquema de controle de versão de nenhuma dessas implementações.

Como observado anteriormente, não haverá novas versões do .NET Standard após a 2.1.

.NET Standard de destino

Você pode criar .NET Standard Libraries usando uma combinação de estrutura netstandard e o metapacote NETStandard.Library.

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 bibliotecas do .NET Standard no Visual Studio, verifique se tem o Visual Studio 2022, o Visual Studio 2019 ou o Visual Studio 2017 versão 15.3 ou posterior instalado no Windows, ou o Visual Studio para Mac versão 7.1 ou posterior instalado 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, o .NET 6, o .NET 7 e o .NET 8 são produtos individuais com um conjunto uniforme de funcionalidades e APIs que podem ser usadas para aplicativos da área de trabalho do Windows e aplicativos de console multiplataforma, serviços de nuvem e sites. Os TFMs do .NET 8, por exemplo, refletem essa ampla gama de cenários:

  • net8.0

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

  • net8.0-windows

    Este é um exemplo de um TFM específico do SO que adiciona funcionalidade específica do SO a tudo a que net8.0 se refere.

Comparação entre o .NET 8.0 e .NET Standard em cenários de direcionamento

No caso do código direcionado ao netstandard, não é necessário alterar o TFM para net8.0 ou para um TFM posterior. O .NET 8 implementa o .NET Standard 2.1 e versões anteriores. O único motivo de redirecionamento do .NET Standard para o .NET 8 e versões posteriores é obter acesso a mais recursos de runtime, recursos de linguagem ou APIs. Por exemplo, para usar o C# 9, você precisa ter como alvo o .NET 5 ou uma versão posterior. Você pode ter fazer o direcionamento múltiplo do .NET 8 e do .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 .NET 5+:

  • Componentes do aplicativo

    Se você está usando bibliotecas para dividir um aplicativo em vários componentes, recomendamos o direcionamento para o net8.0. Para simplificar, é melhor manter todos os projetos que compõem seu aplicativo na mesma versão do .NET. Em seguida, você pode presumir os mesmos recursos BCL em todos os lugares.

  • Bibliotecas reutilizáveis

    Se você estiver criando bibliotecas reutilizáveis que planeja enviar no NuGet, considere o equilíbrio entre alcance e conjunto de recursos disponíveis. O .NET Standard 2.0 é a versão mais recente compatível com .NET Framework, portanto, dá um bom alcance com um conjunto de recursos bastante grande. Não recomendamos ter o .NET Standard 1.x como alvo, pois você limitaria o conjunto de recursos disponível para um aumento mínimo de alcance.

    Caso não precise dar suporte ao .NET Framework, use o .NET Standard 2.1 ou o .NET 8. Recomendamos que você ignore o .NET Standard 2.1 e vá direto para o .NET 8. As bibliotecas mais usadas terão vários alvos para .NET Standard 2.0 e .NET 5+. O suporte ao .NET Standard 2.0 oferece o maior alcance, enquanto o suporte ao .NET 5+ garante que você possa aproveitar os recursos mais recentes da plataforma para clientes que já estão no .NET 5+.

Problemas do .NET Standard

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

  • Lentidão para adicionar novas APIs

    O .NET Standard foi criado como um conjunto de API a que todas as implementações do .NET teriam que dar suporte, portanto, houve um processo de análise de propostas para adicionar novas APIs. A meta era padronizar apenas AS APIs que poderiam ser implementadas em todas as plataformas .NET atuais e futuras. O resultado foi que, se um recurso perdia uma versão específica, poderia ser preciso aguardar alguns anos antes de ele ser adicionado a uma versão do Standard. Então você aguardaria ainda mais para que a nova versão do .NET Standard tivesse amplo suporte.

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

  • Controle de versão complexo

    A separação da especificação da API de suas implementações resulta em 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 nas instruções de como interpretá-la.

    Solução no .NET 5+: não há separação entre uma especificação de API do .NET 5+ e sua implementação. O resultado é um esquema de TFM simplificado. Há um prefixo de TFM para todas as cargas de trabalho: net8.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 net8.0-windows. Graças a essa convenção de nomenclatura de TFM, você pode facilmente determinar se um dado aplicativo pode usar uma biblioteca específica. Nenhuma tabela de equivalentes de número de versão, como a do .NET Standard, é necessária.

  • Exceções sem suporte da plataforma em tempo de execução

    O .NET Standard expõe APIs específicas da plataforma. Seu código pode ser compilado sem erros e parecer ser portátil para 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ê recebe erros em tempo de execução.

    Solução no .NET 5+: os SDKs do .NET 5+ incluem analisadores de código habilitados por padrão. O analisador de compatibilidade da plataforma detecta o uso não intencional de APIs que não têm suporte nas plataformas em que você pretende executar. Para obter mais informações, confira Analisador de Compatibilidade da Plataforma.

.NET Standard não preterido

O .NET Standard ainda é necessário para bibliotecas que podem ser usadas por várias implementações do .NET. Recomendamos que você tenha como alvo o .NET Standard nos seguintes cenários:

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

Confira também