Lançado o .NET 11 Preview 5
O .NET 11 Preview 5 chegou em 9 de junho de 2026 e reforça três frentes de trabalho da plataforma: novas capacidades para desenvolvedores, desempenho em toda a pilha e simplificação das ferramentas. Neste artigo, você vai entender as principais mudanças, incluindo o que Chet Husk e Rich Lander apresentaram no Microsoft Build 2026, com foco no impacto prático para quem trabalha com .NET no dia a dia.
O que chega no .NET 11 Preview 5
A Microsoft publicou o anúncio no blog oficial do .NET, com novidades em bibliotecas, runtime, SDK, C#, ASP.NET Core, .NET MAUI e Entity Framework Core. Por isso, vale começar com um panorama antes de aprofundar cada tema.
Os destaques do .NET 11 Preview 5 incluem:
- Serialização em JSON Lines no
System.Text.Jsone full outer join no LINQ. - Acordo de chaves X25519 na criptografia e APIs numéricas genéricas em
Random. - Otimizações de suspensão no Runtime Async, melhorias no JIT e ajustes no GC.
- Apps baseados em arquivo que referenciam outros arquivos C# com a diretiva
#:ref. - Verificações de vulnerabilidade e fim de suporte durante o build.
- Template de servidor MCP no
dotnet new. - Classes fechadas, declarações de união e a evolução do
unsafeno C#.
Este artigo concentra-se no runtime, nas bibliotecas e no SDK. Para os outros tópicos, o balta.io já publicou análises sobre o ASP.NET Core no Preview 5 e sobre o EF Core no Preview 5.
Melhorias na experiência do SDK e da CLI
O comando dotnet é a porta de entrada de quase todo fluxo de desenvolvimento em .NET. Por isso, boa parte do ciclo do .NET 11 investe em deixar a CLI mais rápida e mais adaptável.
Suporte a dispositivos no dotnet run com MAUI
Durante anos, o dotnet run foi a espinha dorsal do ciclo de desenvolvimento. No .NET 10, os projetos ganharam formas de customizar a execução, o que viabilizou, por exemplo, a integração com o emulador do Azure Functions.
Com o .NET 11, a equipe do MAUI levou o dotnet run para dispositivos físicos e simuladores. Antes, executar um app MAUI exigia compilar, gerar o pacote de instalação, enviá-lo ao dispositivo e iniciar o app remotamente.
Agora, o comando lista os dispositivos disponíveis e escolhe o target framework correto para cada um. Em seguida, ele faz todo o ciclo de deploy e inicialização de forma integrada.
Além disso, o protocolo de descoberta de dispositivos é extensível. Assim, frameworks como Uno e Avalonia também podem adotá-lo.
Contexto de agente na CLI do .NET 11 Preview 5
Uma das adições mais relevantes para o desenvolvimento assistido por IA é a detecção de contexto de agente. Na prática, a CLI percebe quando roda dentro de ferramentas como Claude Code ou GitHub Copilot.
A detecção usa heurísticas e, quando identifica um agente, a CLI muda a forma de renderizar a saída. Com isso, ela também reduz o consumo desnecessário de tokens.
Um bom exemplo é o terminal logger, display de build padrão desde o .NET 10. Ele tem uma seção estática com as saídas dos projetos e uma seção dinâmica que atualiza o progresso o tempo todo.
Para um agente LLM, essa seção dinâmica desperdiça tokens. Por isso, a CLI desativa a atualização ao vivo quando opera sob um agente, e no .NET 11 Preview 5 o dotnet test também desliga a saída ANSI nesses ambientes.
Outro cenário envolve os work trees do Git, que agentes usam para trabalhar em várias branches em paralelo. Antes, vários processos de dotnet build na mesma máquina não sabiam uns dos outros e disputavam recursos.
Nesse sentido, a equipe investiga um gateway centralizado no MSBuild para coordenar builds paralelos.
MSBuild com suporte a múltiplas threads
Historicamente, o MSBuild usa uma arquitetura com vários processos. Ela oferece bom isolamento, mas cobra caro na comunicação entre processos e no carregamento repetido do JIT.
O .NET 11 avança para um modo com várias threads dentro de um único processo. Quando a apresentação aconteceu, esse modo ainda não estava disponível, mas a meta é entregá-lo no lançamento oficial.
Portanto, autores de tasks do MSBuild devem acompanhar a documentação sobre como atualizar tasks para o modo multithread.
Caminho rumo ao Native AOT na CLI
Um dos projetos mais ambiciosos do .NET 11 é migrar a CLI do dotnet para Native AOT. Inclusive, o Preview 5 já traz um caminho rápido opcional com Native AOT para a CLI.
Ferramentas embarcadas já compiladas com AOT
Ferramentas embarcadas como user-secrets, dev-certs e o gerenciador de JWT já usam Native AOT. Em uma máquina Windows, o dotnet user-secrets levou em média 54 milissegundos, e apenas 14 milissegundos foram o código da aplicação.
O restante foi overhead da CLI gerenciada. Ou seja, o ganho cresce à medida que mais comandos fizerem a transição.
O argumento vai além do desempenho imediato, pois a CLI roda dezenas de vezes por dia. Assim, cada economia de 100 milissegundos por comando se multiplica.
Também existe um ganho para o ecossistema. Várias bibliotecas da Microsoft não suportavam trim ou AOT, e transformar a CLI em aplicação AOT forçou a equipe a remover esses bloqueios.
No ciclo do .NET 11, bibliotecas de templating, o NuGet e partes do MSBuild ficaram mais amigáveis ao trimming. Com isso, a comunidade publica aplicações trim e AOT com mais facilidade.
Observabilidade via OpenTelemetry
Com o Native AOT, a CLI também passou a emitir telemetria via OpenTelemetry. Dessa forma, você usa o Aspire Dashboard para inspecionar a execução dos comandos com rastreamento distribuído.
O dashboard exibe os spans nativos da CLI separados dos spans da parte gerenciada. Assim, você enxerga com detalhe o desempenho de cada operação.
Redução do tamanho do SDK no .NET 11 Preview 5
Durante o ciclo que levou ao .NET 11 Preview 5, a equipe descobriu que os tarballs do SDK suportam hard links. Essa técnica faz arquivos idênticos apontarem para um único conteúdo no disco, sem duplicação.
A equipe automatizou a inspeção do layout dos pacotes e aplicou a deduplicação. Como resultado, os payloads do SDK perderam aproximadamente 80 megabytes em diversas plataformas.
Em containers, onde pipelines de CI/CD baixam o SDK com frequência, isso significa builds mais rápidos e imagens menores. Além disso, o .NET 11 Preview 5 passa a checar vulnerabilidades e fim de suporte do SDK durante o build.
Bibliotecas do .NET 11 Preview 5
As bibliotecas de runtime recebem APIs que atacam problemas antigos de ergonomia e segurança. A seguir estão as mais relevantes para o dia a dia.
Nova API para gerenciamento de processos
A API de Process sempre gerou bugs, sobretudo ao capturar StandardOutput e StandardError de forma síncrona. O problema clássico era um deadlock quando um dos buffers enchia enquanto o código esperava o outro terminar.
O .NET 11 introduz APIs de conveniência que resolvem isso com segurança:
RunAndCaptureTextAsyncdevolve umProcessTextOutputcom saída, erro e código de saída, sem risco de deadlock.ReadAllLinesAsyncpercorre as linhas de forma assíncrona e indica se cada linha veio deStandardError.SafeFileHandle.CreateAnonymousPipeviabiliza pipes entre processos, como o|dos shells Unix.- Um modo fire-and-forget atende quem não precisa esperar o processo e permite encerrar o filho junto com o pai.
using System.Diagnostics;
// captura saída, erro e código de saída em uma única chamada
ProcessTextOutput result = await Process.RunAndCaptureTextAsync(
"git", ["status", "--porcelain"]);
Console.WriteLine(result.StandardOutput);
Console.WriteLine($"Exit code: {result.ExitStatus.ExitCode}");
Há também o SafeProcessHandle, pensado para cenários com trim e AOT no .NET 11 Preview 5. No Preview 5, a leitura de linhas de processos também recebeu melhorias.
Texto, Unicode e System.Text.Json
O .NET 11 adiciona IsValid e IndexOfInvalidSubsequence para UTF-8 e UTF-16. Assim, você verifica se um texto externo está bem codificado e descobre exatamente onde está a sequência inválida.
Outra adição é a opção AnyNewLine no Regex, que faz o . reconhecer qualquer variante de quebra de linha. Além disso, métodos de string passaram a operar corretamente sobre runas Unicode, algo essencial com emojis.
O System.Text.Json ganha atributos para configurar políticas de serialização por tipo. Por exemplo, uma classe pode deixar de emitir propriedades null com um único atributo e combinar convenções de nomenclatura diferentes por campo.
No .NET 11 Preview 5, o serializador também suporta JSON Lines, formato com um documento JSON por linha. Na prática, você usa JsonSerializer.SerializeAsyncEnumerable com topLevelValues: true:
// grava cada item como uma linha JSON independente
await JsonSerializer.SerializeAsyncEnumerable(
stream, GetEventsAsync(), topLevelValues: true);
O formato aparece muito em logs de conversas de agentes e em pipelines de streaming.
Compressão com Zstandard
No .NET 11 Preview 5, as APIs do Zstandard (ZStd) já fazem parte do produto, sem as dependências externas de antes. Nos benchmarks de texto, o ZStd ficou próximo do Brotli em taxa de compressão e velocidade.
Agora ele aparece como opção de primeira classe, ao lado de Deflate, GZip e Brotli.
Runtime Async no .NET 11 Preview 5
Quando o compilador C# encontra um método async, ele o reescreve como uma state machine. Essa classe guarda o estado local entre os pontos de await.
O modelo funciona, mas tem custos. Os stack traces ficam poluídos com frames de infraestrutura, os binários crescem e as alocações extras afetam o desempenho.
O .NET 11 Preview 5 mantém o Runtime Async V2, que transfere a suspensão e a retomada dos métodos assíncronos do compilador para o runtime. Para o desenvolvedor, nada muda no código e não existe palavra-chave nova.
Como habilitar o Runtime Async
Para habilitar o recurso, basta adicionar uma propriedade ao arquivo de projeto:
<PropertyGroup>
<Features>runtime-async=on</Features>
</PropertyGroup>
Projetos com target net11.0 não precisam mais de <EnablePreviewFeatures>true</EnablePreviewFeatures>. Além disso, as bibliotecas do runtime já usam runtime-async=on e servem como validação ampla do recurso.
No .NET 11 Preview 5, o runtime otimiza a suspensão e a retomada e retoma métodos diretamente em código otimizado. Segundo a cobertura da Visual Studio Magazine, um benchmark com muitas suspensões caiu de 6.357,1 para 457,1 milissegundos graças à otimização de On-Stack Replacement.
Benefícios observáveis
O impacto mais visível está nos stack traces ao vivo. No modelo tradicional, um método assíncrono aninhado em outros gera dezenas de frames de infraestrutura.
Com o Runtime Async, o stack trace mostra apenas os métodos reais da aplicação. Isso beneficia profilers, loggers de diagnóstico e depuradores.
Os breakpoints também funcionam dentro desses métodos, e o depurador atravessa os await sem entrar em código gerado. Por outro lado, o runtime reutiliza objetos de continuação e evita salvar variáveis locais inalteradas, o que reduz alocações.
O recurso é compatível com Native AOT e ReadyToRun. Além disso, código com e sem Runtime Async se chama livremente, então nada quebra quando o recurso virar padrão no .NET 12.
Para um mergulho maior nesse tema, veja as novidades do runtime no Preview 5.
JIT e segurança de memória no .NET 11 Preview 5
O JIT do .NET 11 melhorou a eliminação de verificações de bounds. Por exemplo, se o código verifica que i + 2 < length, o JIT entende que i + 1 também está no intervalo e remove a checagem redundante.
O mesmo raciocínio vale para slices a partir do fim de um Span. Além disso, o inlining agora elimina verificações de null duplicadas que surgem após a expansão de um método.
Outro objetivo é tornar as APIs de SIMD seguras sem o modificador unsafe. Hoje, muito código de alto desempenho depende de unsafe e de MemoryMarshal, o que dificulta auditorias.
No .NET 11, o JIT passa a inferir bounds e alinhamento de forma estática. Assim, o mesmo código roda sem unsafe e com o mesmo desempenho.
O projeto de segurança de memória ocupa dois releases. No .NET 11, ele aparece em preview, com mudanças de linguagem aplicadas em System.Private.CoreLib.
A meta é redefinir o unsafe como um contrato de chamador auditável, em vez de só desligar verificações. Nesse contexto, o .NET 11 Preview 5 traz a evolução do unsafe no C#, que move a fronteira insegura para as operações de desreferência de memória.
Como testar o .NET 11 Preview 5
O SDK está disponível na página de download do .NET 11. No Windows, a recomendação é usar o Visual Studio 2026 Insiders, enquanto no VS Code a extensão C# Dev Kit atende bem.
Lembre que versões de preview não devem ir para produção. Portanto, use o .NET 11 Preview 5 para avaliar recursos, testar compatibilidade e enviar feedback à equipe pelas discussões e issues do GitHub.
Para conhecer as mudanças de ferramentas em detalhe, leia também as novidades no SDK e ferramentas do Preview 5.
Conclusão
O .NET 11 Preview 5 mostra um ciclo de maturidade técnica profunda. A migração da CLI para Native AOT, o Runtime Async, o MSBuild com várias threads e as novas APIs formam um conjunto coeso de investimentos.
Os benefícios aparecem em três contextos. Primeiro, em ambientes com agentes de IA, onde a CLI opera com menos overhead.
Depois, em workloads de alta concorrência, onde Runtime Async, SIMD e JIT reduzem alocações e aumentam o throughput. Por fim, em pipelines de CI/CD e containers, onde o SDK menor acelera os builds.
A versão final do .NET 11 está prevista para novembro de 2026. Até lá, vale experimentar o .NET 11 Preview 5 e contribuir com feedback.
FAQ
O Runtime Async exige mudanças no código-fonte?
Não. Basta adicionar <Features>runtime-async=on</Features> ao arquivo de projeto para habilitar o recurso.
O modo multithread do MSBuild quebra tasks existentes?
Tasks não atualizadas continuam funcionando em um processo separado via TaskHost. A migração é opcional para correção, mas recomendada para desempenho.
A detecção de contexto de agente na CLI é confiável?
Ela usa heurísticas e pode não cobrir todos os casos. A equipe ajusta o comportamento conforme identifica novos padrões de uso.
O Native AOT da CLI já está pronto para produção?
Ainda não. Alguns comandos embarcados já migraram, mas o binário principal do dotnet continua em transição.
O Zstandard exige bibliotecas nativas extras?
Não. No .NET 11, as APIs de Zstandard fazem parte do produto.
Quando o Runtime Async vira padrão?
A expectativa é o .NET 12. Mesmo assim, você poderá desativá-lo por projeto com <UseRuntimeAsync>false</UseRuntimeAsync>.