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.

App híbrido do .NET 6 Preview 1 rodando nativamente no macOS, com um componente Blazor exibindo um alert
Blazor Desktop em um app nativo no macOS.
Aplicação WPF no Windows hospedando um componente web escrito com Blazor que dispara um alert
O mesmo cenário híbrido rodando no Windows com WPF.

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.

Glossário

Termo Significado
LTS Long Term Support, versão com três anos de suporte
Preview Versão de testes lançada antes da versão final
.NET MAUI Multi-platform App UI, framework para criar apps nativos multiplataforma com .NET
Xamarin.Forms Framework anterior ao MAUI para interfaces mobile compartilhadas
Xamarin.Essentials Bibliotecas para acessar recursos nativos como sensores e armazenamento
Blazor Desktop Modelo híbrido que roda componentes Blazor dentro de um app nativo
WebView Componente que exibe conteúdo web dentro de um app nativo
Rosetta 2 Camada da Apple que emula apps x64 em processadores Apple Silicon
Single file app Aplicação publicada como um único binário executável
TFM Target framework moniker, identificador como net6.0-android
JIT Just in time, compilação feita durante a execução
AOT Ahead of time, compilação feita antes da execução
HTTP/3 Versão do protocolo HTTP que roda sobre o QUIC
Savepoint Ponto intermediário de uma transação que permite desfazer apenas parte dela

Fontes