Novidades do .NET 6 - Preview 1
O .NET 6 Preview 1 saiu em 17 de fevereiro de 2021, com lançamento final programado para novembro do mesmo ano. Neste artigo, vamos conferir os detalhes desse primeiro preview e o que ele indicava para o futuro da plataforma.
A Microsoft definiu o .NET 6 como uma versão LTS, com três anos de suporte após o lançamento. Por isso, cada preview recebeu bastante atenção de quem planejava migrar aplicações do .NET Core 3.1 e do .NET 5.
A unificação no .NET 6 Preview 1
O .NET 6 quer continuar o que o .NET 5 começou: a unificação da plataforma. A ideia é compartilhar cada vez mais código entre diversas plataformas usando apenas .NET.
Inicialmente, o foco está em trazer Android, iOS e macOS, vindos do Xamarin, para dentro do .NET principal. Além disso, existe a possibilidade de integração híbrida com o Blazor, na linha do que o projeto Mobile Blazor Bindings já experimentava.
Em suma, seja você um desenvolvedor mobile, desktop ou web, o .NET 6 Preview 1 mostra uma plataforma focada em atender todos esses cenários. Na prática, a promessa é usar o mesmo SDK, as mesmas bibliotecas base e as mesmas ferramentas em todos eles.
Quando falamos em melhorar a experiência, a mudança é grande. Por exemplo, depois de instalar o SDK, basta executar dois comandos para criar e rodar um app Android no emulador.
# Cria e executa um app Android no emulador configurado
dotnet new android
dotnet run
Para isso, o .NET 6 introduz novos target framework monikers específicos de plataforma. Entre eles estão net6.0-android, net6.0-ios, net6.0-maccatalyst, net6.0-macos, net6.0-tvos e net6.0-windows.
Planejamento aberto e suporte
O .NET 6 conta com um planejamento aberto, que você pode acompanhar no GitHub. A equipe criou o site themesof.net, um app Blazor que mostra temas, épicos e histórias de usuário com suas prioridades.
Dessa forma, a comunidade consegue ver o que está em andamento e opinar antes das decisões finais. Quanto ao suporte, o .NET 6 será LTS, com três anos de atualizações a partir de novembro de 2021.
O .NET MAUI no .NET 6 Preview 1
MAUI é a sigla para Multi-platform App UI, uma forma mais moderna de criar interfaces para diversas plataformas com o .NET como base. Ele estende o Xamarin.Forms e terá sua versão inicial incluída no .NET 6.
O maior foco do MAUI é entregar apps com visual melhor e mais código compartilhado entre as plataformas. Nesta primeira versão, a meta é criar apps para Android, iOS, macOS e Windows a partir de um único projeto.
Como prioridades dessa primeira release, a equipe destacou a performance dos apps, os componentes e a experiência de desenvolvimento. Recursos como Hot Reload nos apps também fazem parte do plano.
Com a chegada do MAUI, o Xamarin.Essentials também passa a fazer parte do .NET 6. Trata-se de um conjunto de bibliotecas para acessar recursos nativos dos dispositivos, como sensores e armazenamento.
No .NET 6 Preview 1, o suporte inicial cobre Android e iOS, enquanto macOS e Windows ficam para previews futuros. Mesmo assim, você já pode começar hoje no .NET 6 com Xamarin e Xamarin.Forms, já que a Microsoft prometeu ferramentas de conversão e guias de migração.
Se quiser ver o MAUI funcionando em um preview logo na sequência, o artigo com o hands-on do MAUI no .NET 6 Preview 2 mostra o passo a passo.
Blazor Desktop no .NET 6 Preview 1
O Blazor se tornou bem popular desde o lançamento, e o poder de trabalhar com C# nas interfaces web, inclusive reusando código, atrai muitos desenvolvedores. Se você ainda não conhece a tecnologia, vale ler a visão geral do Blazor antes de seguir.
Projetos como o Mobile Blazor Bindings permitem plugar componentes Blazor em apps nativos, com comunicação entre as duas partes. Com isso, o Blazor ganhou ainda mais espaço fora do navegador.
O Blazor Desktop é justamente uma evolução disso. Ele permite criar apps híbridos, com uma parte nativa e outra web, reusando componentes que você já escreveu para o seu app web.
Em suma, temos um contêiner que é a aplicação nativa e, dentro dele, vários componentes Blazor ou até um app completo. Segundo o anúncio oficial, esse modelo usa uma WebView embarcada em vez do WebAssembly, em uma arquitetura parecida com a do Electron.
O Blazor também roda sobre o MAUI, o que permite ter interfaces em XAML interagindo com ele. Nas imagens abaixo, temos um app rodando nativamente no macOS e outro no Windows com WPF, onde o componente web escrito com Blazor chama um alert.
Outras melhorias do .NET 6 Preview 1
Além dos grandes temas, o .NET 6 Preview 1 traz uma série de melhorias de base. Entre elas estão loops internos de desenvolvimento mais rápidos, melhor suporte a ARM64, ajustes para containers, novidades na CLI e novas APIs de matemática.
Apple Silicon e Rosetta 2
O .NET 6 traz suporte nativo a Arm64 para os novos processadores Apple Silicon M1. Segundo o anúncio, a Microsoft vai entregar builds Arm64 e x64 para macOS.
No entanto, esse suporte ainda estava em estágio inicial no .NET 6 Preview 1. A depuração de apps Arm64 nativos, por exemplo, ainda não funcionava.
Enquanto isso, o Rosetta 2 cumpre o papel de ponte. Ele é a camada que emula, nos processadores M1, apps que não foram feitos para eles.
A Microsoft trabalhou junto com a Apple para que apps .NET 5 x64 rodassem com boa estabilidade via Rosetta 2 no macOS Big Sur 11.2 ou superior. Assim, quem já tinha um Mac M1 conseguia trabalhar mesmo antes do suporte nativo completo.
Single file apps no Windows e no macOS
Outra novidade do .NET 6 Preview 1 é a publicação em arquivo único chegando ao Windows e ao macOS. Antes, esse recurso estava completo apenas no Linux.
O resultado é um único binário que não precisa ser extraído nem usar pastas temporárias. Para isso, o superhost inclui os binários do CoreCLR com link estático.
No macOS, esses apps de arquivo único também passam a atender aos requisitos de notarização da Apple. Isso facilita a distribuição de ferramentas fora da App Store.
Containers, ARM64 e novas APIs
As imagens de container padrão passam a usar Debian 11 (bullseye), Alpine 3.13 e Ubuntu 20.04. Além disso, Windows Forms e WPF ganharam suporte inicial a ARM64.
Na parte de bibliotecas, chegam APIs como Math.SinCos, que calcula seno e cosseno ao mesmo tempo. Também entram ReciprocalEstimate, ReciprocalSqrtEstimate e novas sobrecargas de Clamp, DivRem, Min e Max para nint e nuint.
A CLI também ganhou suporte a arquivos de resposta, como @file.rsp, para passar argumentos que não cabem no terminal. Por fim, o thread pool foi reescrito em C# para manter o mesmo comportamento no CoreCLR e no Mono.
EF Core 6 no .NET 6 Preview 1
O EF Core 6 também teve seu primeiro preview junto com o .NET 6 Preview 1. Por enquanto, ele ainda roda sobre o .NET 5, mas isso deve mudar em breve para exigir o .NET 6.
Um ponto importante é que o EF Core 6 não vai rodar no .NET Framework. Então, se você ainda mantém aplicações nele, já é bom começar a pensar em migrar.
Atributo Unicode
Junto ao EF Core 6, temos o novo atributo Unicode, que controla a geração do tipo de caractere no banco. Assim, você mapeia uma string para uma coluna não Unicode sem informar o tipo do banco diretamente.
public class Book
{
public int Id { get; set; }
public string Title { get; set; }
// Gera varchar em vez de nvarchar no SQL Server
[Unicode(false)]
[MaxLength(22)]
public string Isbn { get; set; }
}
CREATE TABLE [Book] (
[Id] int NOT NULL IDENTITY,
[Title] nvarchar(max) NULL,
[Isbn] varchar(22) NULL,
CONSTRAINT [PK_Book] PRIMARY KEY ([Id]));
Repare que apenas a coluna Isbn usa varchar. Por outro lado, Title continua como nvarchar(max), que é o padrão.
Atributo Precision
Outra mudança interessante é a possibilidade de informar precision e scale em tipos decimais diretamente via Data Annotations. Dessa forma, você não precisa criar um arquivo de mapeamento só para isso.
public class Product
{
public int Id { get; set; }
// Mapeia para decimal(10,2)
[Precision(precision: 10, scale: 2)]
public decimal Price { get; set; }
}
CREATE TABLE [Product] (
[Id] int NOT NULL IDENTITY,
[Price] decimal(10,2) NOT NULL,
CONSTRAINT [PK_Product] PRIMARY KEY ([Id]));
Função Random e outros recursos
O EF Core 6 traz também o EF.Functions.Random(), que vira a função de número aleatório do banco nas queries. No SQL Server, por exemplo, ele se transforma em RAND.
var users = context.Users
.Where(u => u.Popularity == (int)(EF.Functions.Random() * 5.0) + 1)
.ToList();
SELECT [u].[Id], [u].[Popularity], [u].[Username]
FROM [Users] AS [u]
WHERE [u].[Popularity] = (CAST((RAND() * 5.0E0) AS int) + 1)
A tradução funciona no SQL Server, no SQLite e no Cosmos. Além disso, o preview traz o EntityTypeConfigurationAttribute, que aplica automaticamente uma implementação de IEntityTypeConfiguration sem chamá-la no OnModelCreating.
Também chegam o suporte a colunas esparsas no SQL Server e a tradução de ToString no SQLite. O banco em memória, por sua vez, passa a validar se propriedades obrigatórias não estão nulas.
Microsoft.Data.Sqlite no .NET 6 Preview 1
A Microsoft tem investido bastante no SQLite, e o provider oficial também chega em nova versão, acompanhando o EF Core 6. Entre as novidades estão uma API de savepoints e a configuração de timeout de comando.
Na prática, savepoints permitem desfazer parte de uma transação sem descartar tudo. Isso é útil em operações longas, onde só um trecho precisa voltar atrás.
ASP.NET Core no .NET 6 Preview 1
Inicialmente, o ASP.NET Core não traz tantas mudanças, até porque está bem maduro. Mesmo assim, o preview entrega recursos práticos e apresenta um roteiro com itens de grande impacto.
Entre o que já chegou no .NET 6 Preview 1, o MVC passa a suportar IAsyncDisposable em controllers, page models e view components. O Blazor ganhou o componente DynamicComponent, que renderiza um componente a partir do seu tipo.
<DynamicComponent Type="@componentType" Parameters="@parameters" />
Os componentes de input do Blazor, como InputText e InputDate, agora expõem um ElementReference. Com isso, fica mais simples controlar o foco desses campos.
Além disso, uma quantidade significativa de APIs recebeu anotações de tipos de referência anuláveis. O resultado é mais segurança em tempo de compilação contra NullReferenceException.
Hot Reload
O ASP.NET tem focado cada vez mais na experiência de desenvolvimento, e o Hot Reload é peça importante disso. Atualizar a interface de apps Razor e Blazor sem perder o estado traz muito mais produtividade.
Esse recurso faz parte do roteiro do .NET 6, junto com o tema Fast Inner Loop, que também busca builds mais rápidos.
Micro APIs
Outro item do roteiro é uma nova forma de criar APIs realmente pequenas, com apenas um endpoint, por exemplo. Assim, você não precisa trazer todo o template do ASP.NET com MVC e afins.
Essa ideia conversa com os top level programs do C# 9, que dispensam o método Main obrigatório. A proposta reduz código e complexidade, e mais tarde ela se consolidou nas minimal APIs.
WebAssembly AOT e publicação em arquivo único
A compilação ahead of time para WebAssembly é, possivelmente, o item mais aguardado do roteiro. Com JIT, o app compila na hora da execução, enquanto o AOT compila antes e melhora principalmente a primeira execução.
Aqui o alvo é o Blazor WebAssembly, uma das tecnologias que mais precisam desse ganho. Afinal, o .NET no navegador ainda usa partes do Mono e fica relativamente pesado comparado a apps React ou Angular.
O roteiro também prevê publicar uma aplicação ASP.NET Core em um único arquivo, de forma standalone e com alta performance. É o mesmo app, porém empacotado em um só binário.
SPA, Blazor híbrido e HTTP/3
Os templates de SPA que acompanham o Visual Studio devem receber atualizações para as versões mais novas de Angular e React. Muitos times, porém, preferem criar o front fora do ASP.NET e até fora do Visual Studio.
O roteiro inclui ainda os apps desktop híbridos com Blazor, combinando Blazor e .NET MAUI. Na live do balta.io de novembro de 2020, inclusive, apareceu uma demo de Blazor Mobile Bindings com um app Blazor instalado no macOS.
Por fim, está previsto o suporte a HTTP/3 e ao protocolo QUIC nos servidores do ASP.NET Core. Se o seu ambiente suportar, você poderá usar essas novidades.
Como acompanhar o .NET 6 Preview 1
A Microsoft planejou previews aproximadamente mensais até o lançamento em novembro. Portanto, vale instalar o .NET 6 Preview 1 em paralelo ao SDK atual e testar em projetos de estudo.
Um global.json por repositório ajuda a controlar qual SDK cada projeto usa. Dessa forma, seus projetos de produção continuam no .NET 5 ou no .NET Core 3.1 enquanto você experimenta.
Para ver o que veio no mês seguinte, confira as novidades do .NET 6 Preview 2. O anúncio oficial do .NET 6 Preview 1 no blog da Microsoft traz a lista completa de mudanças.
Conclusão
É apenas o primeiro preview, e ainda vamos falar bastante do .NET 6 por aqui. Mesmo assim, o .NET 6 Preview 1 já indica uma versão com grandes mudanças para o nosso ambiente de desenvolvimento.
A unificação com Xamarin, o MAUI, o Blazor Desktop e o EF Core 6 apontam para um .NET realmente multiplataforma. Ao mesmo tempo, o roteiro do ASP.NET Core mostra foco em produtividade e performance.
Uma expectativa que fica é ver o MAUI aceitar interfaces só com sintaxe declarativa em C#, sem XAML. Afinal, escrever todo o código em C# e vê-lo rodando no desktop, na web e no mobile seria um passo enorme.
FAQ
Quando o .NET 6 Preview 1 foi lançado?
A Microsoft anunciou o .NET 6 Preview 1 em 17 de fevereiro de 2021. A versão final estava programada para novembro de 2021.
O .NET 6 é LTS?
Sim, o .NET 6 é uma versão LTS, com três anos de suporte a partir do lançamento.
O MAUI já funciona no .NET 6 Preview 1?
O trabalho começou pelo suporte a Android e iOS, vindo do Xamarin. macOS e Windows ficaram para previews seguintes.
O EF Core 6 roda no .NET Framework?
Não, o EF Core 6 não roda no .NET Framework. No primeiro preview ele usava o .NET 5, com plano de passar a exigir o .NET 6.
Qual a diferença entre Blazor Desktop e Blazor WebAssembly?
O Blazor Desktop roda os componentes dentro de um app nativo, usando uma WebView embarcada. Já o Blazor WebAssembly executa o .NET no navegador.