Skip to content
CW
Navegação

Idioma

Navegação

Voltar para o Blog
10 nov. 2026 8 min leitura 5 Visualizações

.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, hierarquias closed, argumentos em collection expressions, extension indexers e break/continue com 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 Process bem mais amigável e FullJoin no 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 run agora pergunta o target framework e o dispositivo, emulador ou simulador.
  • O dotnet watch funciona no Android e, no iOS, com MtouchLink igual a None.
  • Novos templates de teste (androidtest, iostest, maccatalysttest e 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 Passkeys em Microsoft.Maui.Authentication com IsSupported, CreateAsync (registrar) e AssertAsync (entrar), usando JSON WebAuthn padrão. O seu servidor continua responsável pelo challenge e pela validação.
  • Permissions.PostNotifications agora está implementado no iOS.
  • Window.StatusBarTheme para estilo Light, Dark ou Default da barra de status.
  • Splash screens com tema, usando DarkFile, DarkColor e DarkTintColor.
  • 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.Compatibility não é mais distribuído. Apps que só referenciam Microsoft.Maui.Controls estã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, NavigationPage e TabbedPage usam novos handlers. O Appearing agora dispara antes do push, então mova o trabalho que depende da página visível para o NavigatedTo.
  • O Windows usa o novo handler CollectionView2 por padrão. Dá para desativar temporariamente com UseWindowsCollectionView2Handler igual a false.
  • A classe Color agora é 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.RequestCircuitPauseAsync permite 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

  • EnvironmentView com Include e Exclude, como o environment tag helper do MVC.
  • NavigationManager.GetUriWithFragment e opções de navegação relativa.
  • Suporte a IHostedService no Blazor WebAssembly.
  • Um novo servidor de desenvolvimento Microsoft.AspNetCore.Components.Gateway para 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 como anyOf.
  • 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.

  1. Atualize o global.json se você fixa o SDK e mude os target frameworks para net11.0, mantendo os sufixos de plataforma.
  2. Atualize pacotes e workloads e leia a lista de breaking changes.
  3. No MAUI, teste em dispositivos reais. O CoreCLR como runtime padrão é a mudança com mais chance de te surpreender.
  4. 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)

Cezar Wagenheimer

Escrito por

Cezar Wagenheimer

Compartilhe

Comentários

Ficou com uma dúvida ou encontrou um problema no código? Comente abaixo — eu leio e respondo pessoalmente.

Carregando comentários…

Deixe seu comentário

Continue lendo

Deploy // Reconectando
Reconectando ao Servidor

Uma nova versão do ecossistema está sendo aplicada. A conexão será restabelecida automaticamente em instantes.