.NET 11 Chegou: Novidades para MAUI e Blazor
O .NET 11 saiu. Um tour prático pelas novidades de .NET MAUI e Blazor: CoreCLR por padrão, Hot Reload, QuickGrid, CacheView, passkeys e mais.
Dia de lançamento
Hoje, 10 de novembro de 2026, a Microsoft anunciou o .NET 11 na .NET Conf. É também o dia em que .NET 8 e .NET 9 chegam ao fim do suporte. Se você ainda tem apps em qualquer um dos dois, acabou de ganhar um item novo na agenda.
Li o anúncio oficial e as notas de versão de MAUI e ASP.NET Core linha por linha. Este post é a versão filtrada: o que realmente importa para quem faz apps mobile com .NET MAUI ou web com Blazor, mais o código que você vai querer testar primeiro.
Uma nota sobre suporte: o .NET 11 é uma versão STS (Standard Term Support), com dois anos de suporte. O .NET 10 continua sendo o LTS. Além disso, o .NET MAUI segue uma política de suporte própria, separada do ciclo do runtime. (Fontes no final do post, todas externas.)
O panorama geral
- C# 15 vira o padrão para
net11.0, com union types, hierarquiasclosed, argumentos em collection expressions, extension indexers ebreak/continuecom label. - Runtime Async (preview) move a suspensão e a retomada de async para o runtime, com call stacks mais limpos em profilers e debuggers.
- A CLI do dotnet ficou mais rápida: host Native AOT e um servidor MSBuild que continua aquecido entre as chamadas.
- Compressão Zstandard nativa, uma API
Processbem mais amigável eFullJoinno LINQ. - Peças para IA: Microsoft.Extensions.AI, Microsoft Agent Framework e um template de servidor MCP que já vem no SDK:
dotnet new mcpserver -o MyMcpServer
Agora, as partes que mais me interessam.
.NET MAUI 11: qualidade em primeiro lugar
A documentação do MAUI descreve esta versão como focada em qualidade do produto, e a lista confirma. Menos brilho, mais coisas que param de te incomodar.
CoreCLR é o novo runtime padrão
Esta é a manchete. Apps que miram o .NET 11 rodam em CoreCLR em vez de Mono, tanto no Android quanto nas plataformas Apple. Nas plataformas Apple que não permitem JIT, código pré-compilado e o interpretador cobrem a lacuna. O NativeAOT está disponível como opção de publicação, mas no Android ainda é experimental.
Se você publica em produção, planeje uma rodada completa de regressão antes de trocar o target framework. Troca de runtime é o tipo de mudança que aparece nos cantos do app, não na demo.
Hot Reload e o ciclo de desenvolvimento
O XAML Incremental Hot Reload está em preview e vem habilitado por padrão em builds Debug. Ele atualiza páginas e controles ao vivo, incluindo edições estruturais suportadas, sem sair da tela. Se ele se comportar mal no seu projeto, dá para desligar:
<PropertyGroup>
<EnableMauiIncrementalHotReload>false</EnableMauiIncrementalHotReload>
</PropertyGroup>
Outras melhorias no dia a dia:
- O
dotnet runagora pergunta o target framework e o dispositivo, emulador ou simulador. - O
dotnet watchfunciona no Android e, no iOS, comMtouchLinkigual aNone. - Novos templates de teste (
androidtest,iostest,maccatalystteste companhia) baseados no Microsoft.Testing.Platform:
dotnet new androidtest -n MyTests
cd MyTests
dotnet test
XAML mais limpo e mais rápido
Os namespaces XAML implícitos vêm ligados por padrão, então você não repete mais as declarações padrão na raiz de cada arquivo. Os resource dictionaries agora são preguiçosos (lazy), e a documentação cita inicialização até 8x mais rápida.
Há também a nova diretiva x:Code para C# inline, mas ela exige EnablePreviewFeatures, então trate como brinquedo por enquanto.
Os bindings também ganharam uma melhoria segura para trimming. Um RelativeSource com AncestorType resolvível agora compila para um binding amigável a AOT:
<Button Command="{Binding Source={RelativeSource AncestorType={x:Type local:PeopleViewModel}},
Path=DeleteEmployeeCommand}" />
Novos controles e gestos
Um LongPressGestureRecognizer nativo, finalmente, sem behaviors customizados:
<Image Source="dotnet_bot.png">
<Image.GestureRecognizers>
<LongPressGestureRecognizer Duration="500"
LongPressed="OnLongPressed" />
</Image.GestureRecognizers>
</Image>
void OnLongPressed(object sender, LongPressGestureRecognizerEventArgs e)
{
if (e.State == GestureState.Completed)
{
// Handle completed long press
}
}
O BoxView agora tem a propriedade Fill, que aceita qualquer brush, então gradientes funcionam sem gambiarra. O TabbedPage ganha badges (BadgeText, BadgeColor, BadgeTextColor) e o SwipeItem ganha IconColor e TextColor com suporte a AppThemeBinding.
O controle Map recebeu uma grande atualização: clustering de pins, ícones de pin customizados, MapLongClicked, formas clicáveis e uma implementação para Windows baseada no Azure Maps.
Rotas do Shell com parâmetros de caminho
O Routing.RegisterRoute agora entende templates de rota. Os valores chegam via QueryProperty ou IQueryAttributable:
Routing.RegisterRoute("trip/{tripId}", typeof(TripDetailPage));
await Shell.Current.GoToAsync("//routes/trip/SEA-204");
Por enquanto exige navegação absoluta, o que vale saber antes de refatorar qualquer coisa.
Recursos de plataforma que valem a pena
- Passkeys: a nova classe
PasskeysemMicrosoft.Maui.AuthenticationcomIsSupported,CreateAsync(registrar) eAssertAsync(entrar), usando JSON WebAuthn padrão. O seu servidor continua responsável pelo challenge e pela validação. Permissions.PostNotificationsagora está implementado no iOS.Window.StatusBarThemepara estilo Light, Dark ou Default da barra de status.- Splash screens com tema, usando
DarkFile,DarkColoreDarkTintColor. MediaPickerOptions.SaveToGallery, que por padrão éfalse.
Breaking changes para ler antes de atualizar
Esta é a parte que vai te custar uma tarde se você pular:
- O
Microsoft.Maui.Controls.Compatibilitynão é mais distribuído. Apps que só referenciamMicrosoft.Maui.Controlsestão bem; todos os outros precisam migrar. - O nível mínimo de API do Android sobe de 21 para 24, e x86 deixa de ser suportado.
- No iOS e no Mac Catalyst,
NavigationPageeTabbedPageusam novos handlers. OAppearingagora dispara antes do push, então mova o trabalho que depende da página visível para oNavigatedTo. - O Windows usa o novo handler
CollectionView2por padrão. Dá para desativar temporariamente comUseWindowsCollectionView2Handlerigual afalse. - A classe
Coloragora é sealed.
Blazor no .NET 11: mais rápido, mais seguro e um pouco agêntico
As mudanças do Blazor estão nas notas de versão do ASP.NET Core 11, e são muitas.
Anti-forgery ligado por padrão
Projetos Blazor Web App não precisam mais chamar app.UseAntiforgery(). A proteção contra CSRF é automática. Uma linha a menos no Program.cs e uma coisa a menos para esquecer.
CacheView para SSR estático
O novo componente CacheView faz cache da saída renderizada de uma subárvore durante o SSR estático. Em um acerto de cache, o markup é reaproveitado sem criar os componentes filhos nem executar o ciclo de vida deles:
<CacheView VaryByQuery="category" ExpiresAfter="TimeSpan.FromMinutes(5)">
<ProductList Category="@Category" />
</CacheView>
QuickGrid aprende sobre URLs
O QuickGrid agora guarda o estado de paginação e ordenação na query string, por exemplo ?page=2&sort=Name&direction=asc. Cabeçalhos e controles de paginação são renderizados como links, então funciona em SSR estático sem interatividade. Também ganhou o parâmetro OnRowClick:
<QuickGrid Items="@people.AsQueryable()"
OnRowClick="@((Person args) => HandleRowClick(args))">
<PropertyColumn Property="@(p => p.Name)" />
<PropertyColumn Property="@(p => p.Email)" />
</QuickGrid>
Atenção: se você estiliza button.col-title, agora precisa mirar também a.col-title, e renomear o título de uma coluna quebra URLs salvas nos favoritos.
Virtualize sem a suposição de altura fixa
O Virtualize não assume mais que todos os itens têm a mesma altura. Ele usa o scroll anchoring nativo do CSS quando disponível. O OverscanCount padrão mudou de 3 para 15. Também dá para pular direto para um item:
<Virtualize TItem="Product" Items="products" InitialItemIndex="500" @ref="list">
<div class="product">@context.Name</div>
</Virtualize>
@code {
private Virtualize<Product> list = default!;
private List<Product> products = ProductCatalog.All;
private async Task GoToTop() => await list.ScrollToItemAsync(0);
}
Formulários: validação no cliente e assíncrona
Formulários em SSR estático com DataAnnotationsValidator agora validam no navegador, sem viagem ao servidor. A validação assíncrona funciona em qualquer modo de renderização via AsyncValidationAttribute e IAsyncValidatableObject, então checar "esse usuário já existe?" não exige mais gambiarra.
Há também um novo componente DisplayName que lê os rótulos dos metadados de [Display].
TempData e sessão no SSR estático
Mensagens flash finalmente ficaram simples:
[SupplyParameterFromTempData]
public string? Message { get; set; }
Valores de sessão funcionam do mesmo jeito com [SupplyParameterFromSession], depois de registrar AddSession() e chamar app.UseSession().
Circuits mais inteligentes no Blazor Server
- O auto-pause por inatividade da aba (opt-in, pelo pacote
Microsoft.AspNetCore.Components.Server.AutoPause) libera memória do servidor e a conexão SignalR após um atraso configurável. - O
Circuit.RequestCircuitPauseAsyncpermite que o servidor peça aos clientes uma pausa graciosa, útil em deploys. - Os circuits agora recebem a autenticação renovada sem precisar reconectar.
Menores, mas úteis
EnvironmentViewcomIncludeeExclude, como o environment tag helper do MVC.NavigationManager.GetUriWithFragmente opções de navegação relativa.- Suporte a
IHostedServiceno Blazor WebAssembly. - Um novo servidor de desenvolvimento
Microsoft.AspNetCore.Components.Gatewaypara WebAssembly standalone, substituindo o pacote DevServer antigo. - Opções do navegador definidas pelo servidor via
WithBrowserOptions.
Experimental: componentes de IA do Blazor
O pacote Microsoft.AspNetCore.Components.AI traz chat com streaming, renderização de ferramentas e fluxos de aprovação. Funciona com qualquer IChatClient, e agentes remotos podem se conectar via AG-UI. É experimental e prerelease durante todo o .NET 11, então use para entender a direção, não para construir o seu produto em cima.
Além de MAUI e Blazor
Como os dois frameworks ficam sobre o ASP.NET Core, alguns recursos da plataforma chegam de brinde:
- Unions do C# funcionam em qualquer lugar que use
System.Text.Json, incluindo Minimal APIs, SignalR e JS interop, com o OpenAPI descrevendo comoanyOf. - OpenAPI 3.2 é o novo padrão para documentos gerados.
- Validação assíncrona para Minimal APIs, endpoints
[ShortCircuit]e compressão de resposta Zstandard.
Vale atualizar hoje?
Minha opinião: instale o SDK hoje e teste seus apps em uma branch, mas sem pressa em produção.
- Atualize o
global.jsonse você fixa o SDK e mude os target frameworks paranet11.0, mantendo os sufixos de plataforma. - Atualize pacotes e workloads e leia a lista de breaking changes.
- No MAUI, teste em dispositivos reais. O CoreCLR como runtime padrão é a mudança com mais chance de te surpreender.
- No Blazor, confira seu CSS se usa QuickGrid, e seus layouts de Virtualize se dependiam do overscan antigo.
Instalar o SDK sozinho não muda o target de nada, então você decide quando cada projeto migra.
Vou fazer um post mais aprofundado quando tiver migrado um app MAUI real para CoreCLR e tiver números para mostrar.
Fontes (todas externas)
- Announcing .NET 11 no .NET Blog
- What's new in .NET MAUI for .NET 11 no Microsoft Learn
- What's new in ASP.NET Core 11 no Microsoft Learn
Comentários
Ficou com uma dúvida ou encontrou um problema no código? Comente abaixo — eu leio e respondo pessoalmente.