Partilhar via


.NET Standard

O Padrão .NET é uma especificação formal das APIs .NET disponíveis em múltiplas implementações .NET. A motivação por detrás do Padrão .NET foi estabelecer uma maior uniformidade no ecossistema .NET. As versões .NET 5 e posteriores adotam uma abordagem diferente para estabelecer uniformidade, eliminando a necessidade do Padrão .NET na maioria dos cenários. No entanto, se quiser partilhar código entre o .NET Framework e qualquer outra implementação de .NET, como o .NET Core, a sua biblioteca deve direcionar-se para o .NET Standard 2.0. Não serão lançadas novas versões .NET Standard, mas .NET 5 e todas as versões posteriores continuarão a suportar .NET Standard 2.1 e anteriores.

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

.NET Versões Standard

.NET Standard é versionado. Cada nova versão adiciona mais APIs. Quando uma biblioteca é construída contra uma determinada versão do .NET Standard, pode correr em qualquer implementação .NET que implemente essa versão do .NET Standard (ou superior).

Direcionar uma versão superior do .NET Standard permite que uma biblioteca use mais APIs, mas significa que só pode ser usado em versões mais recentes do .NET. A escolha de uma versão inferior reduz as APIs disponíveis, mas significa que a biblioteca pode ser executada em mais ambientes.

Selecione a versão .NET Standard

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

Implementação .NET Suporte de versões
.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, 9.0, 10.0
Framework .NET 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
Universal Windows Platform 8.0, 8.1, 10.0, 10.0.16299, por definir
Unidade 2018.1

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

Qual versão do .NET Standard a escolher

Se está a apostar no .NET Standard, recomendamos que opte pelo .NET Standard 2.0, a menos que precise de suportar uma versão anterior. A maioria das bibliotecas de uso geral não deve precisar de APIs fora do .NET Standard 2.0, e o .NET Framework não suporta o .NET Standard 2.1. .NET Standard 2.0 é suportado por todas as plataformas modernas e é a forma recomendada para suportar múltiplas plataformas com um único alvo.

Se precisar de suportar .NET Standard 1.x, recomendamos que também aponte para .NET Standard 2.0. .NET Standard 1.x é distribuído como um conjunto granular de pacotes NuGet, o que cria um grande grafo de dependência de pacotes e resulta no download de muitos pacotes quando o projeto é construído. Para mais informações, consulte Cross-platform targeting e .NET 5+ e .NET Standard mais adiante neste artigo.

Nota

A partir do .NET 9, é emitido um aviso de compilação se o seu projeto tiver como alvo o .NET Standard 1.x. Para mais informações, consulte Aviso emitido para destinos do .NET Standard 1.x.

.NET Regras de versionamento padrão

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

  • Adição: As versões do .NET Standard são logicamente círculos concêntricos: as versões superiores incorporam todas as APIs (Interfaces de Programação de Aplicativos) das versões anteriores. Não há alterações críticas entre as versões.
  • Imutável: Uma vez enviadas, as versões .NET Standard são congeladas.

Não haverá novas versões .NET Standard após a 2.1. Para mais informações, consulte .NET 5+ e .NET Standard mais adiante neste artigo.

Especificação

A especificação .NET Standard é um conjunto padronizado de APIs. A especificação é mantida pelos implementadores do .NET, especificamente pela Microsoft (inclui .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 repositório dotnet/standard (agora arquivado) especifica as APIs do .NET Standard.

O metapacote NETStandard.Library (source) descreve o conjunto de bibliotecas que definem (em parte) uma ou mais versões .NET Standard.

Um determinado componente, como System.Runtime, descreve:

  • Faz parte do padrão .NET (apenas o seu âmbito).
  • Múltiplas versões do .NET Standard, para esse âmbito.

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

Representação do pacote

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

Os pacotes NuGet destinam-se a uma ou mais estruturas. Os pacotes .NET Standard visam o framework ".NET Standard". Pode direcionar o framework .NET Standard usando o moniker do framework de destino compacto netstandard(TFM), por exemplo, netstandard1.4. As bibliotecas destinadas a funcionar em múltiplas implementações de .NET devem direcionar-se para o framework .NET Standard. Para o conjunto mais amplo de APIs, direcione para netstandard2.0, pois o número de APIs disponíveis mais do que duplicou entre o .NET Standard 1.6 e o 2.0.

O metapacote NETStandard.Library refere-se ao conjunto completo de pacotes NuGet que definem .NET Standard. A maneira mais comum de direcionar netstandard é fazendo referência a este metapacote. Descreve e fornece acesso às ~40 bibliotecas .NET e APIs associadas que definem o Padrão .NET. Você pode fazer referência a pacotes adicionais que visam netstandard para obter acesso a APIs adicionais.

Versionamento

A especificação não é singular, mas um conjunto linearmente versionado de APIs. A primeira versão do padrão estabelece um conjunto de linha de base de APIs. As versões subsequentes adicionam APIs e herdam APIs definidas por versões anteriores. Não há nenhuma disposição estabelecida para remover APIs do Padrão.

O Padrão .NET não é específico para nenhuma implementação .NET específica, nem corresponde ao esquema de versionamento de nenhuma dessas implementações.

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

Padrão .NET Target

Pode compilar Bibliotecas .NET Standard usando uma combinação do netstandard framework e do metapacote NETStandard.Library.

Modo de compatibilidade .NET Framework

A partir do .NET Standard 2.0, foi introduzido o modo de compatibilidade .NET Framework. Este modo de compatibilidade permite que projetos .NET Standard consultem bibliotecas do .NET Framework como se tivessem sido compiladas para o .NET Standard. Referenciar bibliotecas do .NET Framework não funciona para todos os projetos, como bibliotecas que utilizam APIs do Windows Presentation Foundation (WPF).

Para mais informações, consulte Modo de Compatibilidade do .NET Framework.

.NET Bibliotecas Standard e Visual Studio

Para construir bibliotecas .NET Standard no Visual Studio, certifique-se de que tem instalado o Visual Studio 2019 ou posterior ou o Visual Studio 2017 versão 15.3 ou posterior no Windows.

Se só precisares de usar bibliotecas .NET Standard 2.0 nos teus projetos, também podes fazer isso no Visual Studio 2015. No entanto, você precisa do cliente NuGet 3.6 ou superior instalado. Pode descarregar o cliente NuGet para Visual Studio 2015 na página de downloads NuGet.

.NET 5+ e .NET Standard

.NET 5, .NET 6, .NET 7, .NET 8, .NET 9 e .NET 10 são produtos únicos com um conjunto uniforme de capacidades e APIs que podem ser usados para aplicações de ambiente de trabalho Windows e aplicações de consola multiplataforma, serviços cloud e websites. Os .NET 10 TFMs, por exemplo, refletem esta vasta gama de cenários:

  • net10.0

    Este TFM é para código que é executado por toda parte. Com algumas exceções, inclui apenas tecnologias que funcionam entre plataformas.

  • net10.0-windows

    Este é um exemplo de um TFM específico do sistema operacional que adiciona funcionalidade específica do sistema operacional a tudo o que net10.0 se refere.

Quando direcionar netx.0 vs. netstandard

Para código existente que visa .NET Standard 2.0 ou posterior, não é necessário alterar o TFM para net8.0 ou um TFM posterior. .NET 8, .NET 9 e .NET 10 implementam o .NET Standard 2.1 e anteriores. A única razão para redirecionar do .NET Standard para o .NET 8+ seria aceder a mais funcionalidades de runtime, funcionalidades de linguagem ou APIs. Por exemplo, para usar C# 9, deves direcionar para .NET 5 ou uma versão posterior. Podes usar .NET e .NET Standard em múltiplos alvos para aceder a funcionalidades mais recentes e ainda assim ter a tua biblioteca disponível para outras implementações .NET.

Nota

Se o seu projeto tem como objetivo .NET Standard 1.x, recomendamos que o retargete para .NET Standard 2.0 ou .NET 8+. Para mais informações, consulte Aviso emitido para destinos do .NET Standard 1.x.

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

  • Componentes da aplicação

    Se estiveres a usar bibliotecas para dividir uma aplicação em vários componentes, recomendamos que direciones net10.0. Para simplificar, é melhor manter todos os projetos que compõem a sua aplicação na mesma versão do .NET. Assim, podes assumir os mesmos recursos BCL em qualquer lugar.

  • Bibliotecas reutilizáveis

    Se você estiver criando bibliotecas reutilizáveis que planeja enviar no NuGet, considere a compensação entre alcance e conjunto de recursos disponíveis. .NET Standard 2.0 é a versão mais recente suportada pelo .NET Framework, por isso oferece bom alcance com um conjunto de funcionalidades bastante vasto. Não recomendamos direcionar ao .NET Standard 1.x, pois limitaria o conjunto de funcionalidades disponíveis para um aumento mínimo de alcance.

    Se não precisares de suportar o .NET Framework, podes optar por .NET Standard 2.1 ou .NET 10. Recomendamos que pule o .NET Standard 2.1 e vá diretamente para o .NET 10. As bibliotecas mais amplamente utilizadas são multi-alvo tanto para .NET Standard 2.0 como para .NET 5+. Suportar .NET Standard 2.0 dá-lhe maior alcance, enquanto suportar .NET 5+ garante que pode aproveitar as funcionalidades mais recentes da plataforma para clientes que já estão em .NET 5+.

Problemas do .NET Standard

Aqui estão alguns problemas do .NET Standard que ajudam a explicar porque é que as versões .NET 5 e posteriores são a melhor forma de partilhar código entre plataformas e cargas de trabalho:

  • Lentidão para adicionar novas APIs

    O Padrão .NET foi criado como um conjunto de APIs que todas as implementações do .NET teriam de suportar, pelo que existia um processo de revisão para propostas de adição de novas APIs. O objetivo era padronizar apenas APIs que pudessem ser implementadas em todas as plataformas .NET atuais e futuras. O resultado foi que, se um recurso perdeu uma versão específica, você pode ter que esperar por alguns anos antes de ser adicionado a uma versão do Standard. Depois, esperaria ainda mais tempo para que a nova versão do .NET Standard fosse amplamente suportada.

    Solução em .NET 5+: Quando uma funcionalidade é implementada, já está disponível para todas as aplicações e bibliotecas .NET 5+ porque a base de código é partilhada. E como não há diferença entre a especificação da API e a sua implementação, consegues tirar partido das novas funcionalidades muito mais rapidamente 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 um mapeamento complexo entre as versões de especificação da API e as versões de implementação. Essa complexidade é evidente na tabela mostrada anteriormente neste artigo e nas instruções de como interpretá-la.

    Solução em .NET 5+: Não há separação entre uma especificação de API .NET 5+ e a sua implementação. O resultado é um regime simplificado de GFT. Há um prefixo TFM para todas as cargas de trabalho: net10.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 net10.0-windows. Graças a esta convenção de nomenclatura do TFM, você pode facilmente saber se um determinado aplicativo pode usar uma determinada biblioteca. Não é necessária nenhuma tabela equivalente a números de versão, como a do .NET Standard.

  • Exceções não suportadas pela plataforma em tempo de execução

    .NET Standard expõe APIs específicas de cada plataforma. Seu código pode ser compilado sem erros e parecer portátil para qualquer plataforma, mesmo que não seja portátil. Quando corre numa plataforma que não tem uma implementação para uma determinada API, surgem erros em tempo de execução.

    Solução em .NET 5+: Os SDKs .NET 5+ incluem analisadores de código que estão ativados por defeito. O analisador de compatibilidade de plataforma deteta o uso não intencional de APIs que não são suportadas nas plataformas em que você pretende executar. Para obter mais informações, consulte Analisador de compatibilidade de plataforma.

.NET Standard não está obsoleto

O Padrão .NET continua a ser necessário para bibliotecas que podem ser usadas por múltiplas implementações .NET. Recomendamos que opte pelo .NET Standard nos seguintes cenários:

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

Consulte também