Novidades do .NET 11 Preview 1: Hot Reload, dotnet run interativo e novos Code Analyzers
O .NET 11 Preview 1 chegou em fevereiro de 2026 com melhorias no SDK que impactam diretamente a produtividade de quem desenvolve. O dotnet run ganhou seleção interativa de target framework e de dispositivo, o Hot Reload aceita novas referências e seis code analyzers apontam problemas de performance.
Neste guia, você vai conhecer cada novidade do SDK, desde os comandos do dotnet CLI até as novas propriedades MSBuild. Assim, fica mais fácil avaliar o que muda em relação ao .NET 10.
O que o .NET 11 Preview 1 traz para o SDK
O primeiro preview de uma versão costuma revelar a direção do ciclo inteiro. No caso do SDK, a direção é clara: menos fricção na linha de comando e mais feedback rápido durante o desenvolvimento.
As mudanças se concentram em cinco frentes. São elas os comandos dotnet run, dotnet test, dotnet watch e dotnet format, além de um conjunto novo de analisadores Roslyn.
Também há ajustes menores, porém úteis, como uma propriedade para publicar símbolos de projetos referenciados. Por fim, chegam um opt-out para a codificação UTF-8 do console e mais consistência para apps baseados em arquivo.
Vale lembrar que o .NET 11 Preview 1 não trouxe novidades só no SDK. O runtime e as bibliotecas também mudaram, e o balta.io cobriu essas áreas nos artigos sobre as novidades no runtime e nas bibliotecas base.
O dotnet run no .NET 11 Preview 1
O dotnet run recebeu a maior atualização desta versão. Agora ele suporta fluxos interativos que facilitam o trabalho com .NET MAUI e com workloads mobile.
Antes, o comando assumia que você sabia exatamente qual framework e qual alvo usar. Em contrapartida, no .NET 11 Preview 1 ele pergunta quando há mais de uma opção válida.
Seleção interativa de target framework
Ao executar um projeto multi-targeted sem a flag --framework, o dotnet run exibe um menu interativo. Você escolhe o target framework desejado usando as teclas de seta.
Essa interface usa a biblioteca Spectre.Console, conhecida por montar prompts e tabelas ricas no terminal. Portanto, a experiência fica parecida com a de outras ferramentas modernas de linha de comando.
Em terminais não interativos, o comportamento também melhorou. Em vez de falhar de forma pouco clara, o comando exibe um erro formatado que lista os frameworks disponíveis.
Na prática, isso elimina a tentativa e erro em scripts e pipelines. Afinal, a própria mensagem já mostra quais valores você pode passar em --framework.
Seleção de dispositivos para .NET MAUI
Se você desenvolve com .NET MAUI, essa novidade muda o fluxo de trabalho pela linha de comando. O dotnet run agora suporta seleção de dispositivos para workloads mobile e embarcados.
Projetos que implementam o target MSBuild ComputeAvailableDevices expõem automaticamente os dispositivos, emuladores e simuladores disponíveis. Os workloads de iOS e Android já fornecem esse target.
Quando existem vários dispositivos, o dotnet run pede que você escolha um interativamente. Além disso, dois novos switches entram em cena:
--device: especifica o dispositivo alvo diretamente, sem prompt interativo.--list-devices: lista os dispositivos disponíveis sem executar a aplicação.
# Lista os dispositivos, emuladores e simuladores disponíveis
dotnet run --list-devices
# Executa direto em um dispositivo conhecido, sem prompt
dotnet run --device <device-id>
O RuntimeIdentifier do dispositivo escolhido segue automaticamente para as etapas de build, deploy e execução. Se o projeto definir o target DeployToDevice, o dotnet run também cuida do deploy.
Com isso, você ganha um pipeline completo de build, deploy e run pela CLI. A especificação do dotnet run para MAUI descreve esse contrato em detalhes.
Essa extensibilidade não é exclusiva do MAUI. Qualquer projeto que forneça os targets MSBuild necessários pode usar a seleção interativa de dispositivos.
dotnet test no .NET 11 Preview 1
No .NET 11 Preview 1, o dotnet test com o Microsoft.Testing.Platform passou a aceitar argumentos posicionais. Ou seja, você não precisa mais informar --project ou flags parecidas de forma explícita.
# Antes (ainda funciona)
dotnet test --project MyProject.csproj
# Agora também funciona
dotnet test MyProject.csproj
Isso traz paridade com o comportamento que já existia no VSTest. Além disso, deixa o comando mais consistente com o restante do dotnet CLI, onde dotnet build e dotnet run já aceitavam o caminho direto.
É uma mudança simples, mas que elimina fricção no dia a dia. Quem migra suítes do VSTest para o MTP, por exemplo, não precisa reescrever scripts por causa da sintaxe.
Hot Reload no .NET 11 Preview 1
O Hot Reload do dotnet watch recebeu duas melhorias importantes no .NET 11 Preview 1. A primeira trata de alterações de referências, e a segunda torna configurável a porta do WebSocket.
Desde o .NET 6, o dotnet watch aplica mudanças em uma aplicação em execução sem rebuild completo, conforme a documentação do dotnet watch. Quando uma mudança não é suportada, ela vira uma rude edit e o comando oferece reiniciar o app.
Novas referências sem reiniciar a aplicação
Essa é provavelmente a melhoria mais aguardada. Até o .NET 10, adicionar um PackageReference ou ProjectReference durante uma sessão de Hot Reload exigia reiniciar a aplicação.
No .NET 11 Preview 1, isso não é mais necessário. Quando você adiciona uma referência durante uma sessão do dotnet watch, o fluxo segue três passos:
- O Roslyn valida a alteração e determina quais projetos precisam de nova implantação.
- Em seguida, o
dotnet watchexecuta o targetReferenceCopyLocalPathsOutputGrouppara copiar as novas dependências para o diretório de saída. - Por fim, o delta applier na aplicação em execução carrega os novos assemblies pelo evento
AssemblyResolving.
<ItemGroup>
<!-- Adicionada com o dotnet watch rodando: não exige mais reinício -->
<PackageReference Include="Humanizer" Version="2.14.1" />
<ProjectReference Include="..\Billing\Billing.csproj" />
</ItemGroup>
Dessa forma, você itera em soluções com vários projetos sem interrupções. O estado da aplicação também se mantém, o que é um ganho real de produtividade.
Porta do WebSocket do dotnet watch no Docker
Uma nova variável de ambiente, DOTNET_WATCH_AUTO_RELOAD_WS_PORT, fixa a porta do WebSocket usado pelo dotnet watch. Esse canal serve para atualizar o navegador quando o conteúdo muda.
Isso é particularmente útil com Docker e contêineres, onde você precisa definir regras de port forwarding antecipadamente. Antes, a porta podia variar entre execuções, o que dificultava o mapeamento.
# Fixa o WebSocket de atualização do navegador em uma porta específica
export DOTNET_WATCH_AUTO_RELOAD_WS_HOSTNAME=0.0.0.0
export DOTNET_WATCH_AUTO_RELOAD_WS_PORT=6123
dotnet watch
A variável complementa a já existente DOTNET_WATCH_AUTO_RELOAD_WS_HOSTNAME, que define o host do WebSocket. Essa melhoria veio da comunidade, com contribuição de @wes-sleeman.
dotnet format no .NET 11 Preview 1
O dotnet format agora suporta o nível de severidade hidden para analisadores e correções de código. Antes, o comando não conseguia direcionar diagnósticos configurados com essa severidade.
Na prática, isso tornava impossível aplicar code fixes para regras como VSTHRD111 pela CLI. Agora você pode usar:
dotnet format --diagnostics VSTHRD111 --severity hidden
Com isso, o controle sobre formatação e qualidade de código pela linha de comando fica mais completo. Em pipelines, por exemplo, você aplica correções que antes exigiam a IDE.
A regra VSTHRD111 vem do pacote Microsoft.VisualStudio.Threading.Analyzers e trabalha com severidade hidden. Por isso, ela era o exemplo clássico de diagnóstico fora do alcance do dotnet format.
Novos code analyzers do .NET 11 Preview 1
O .NET 11 Preview 1 adicionou seis novos analisadores de código Roslyn. Cada um identifica padrões que podem ser otimizados para melhorar performance, confiabilidade e legibilidade.
Todos eles chegam com o próprio SDK, sem pacote extra. Assim, basta atualizar o SDK para que as sugestões apareçam no build e na IDE.
CA1517: ReadOnlySpan de char para constantes
Quando você tem valores constantes do tipo string, o analisador sugere trocar por ReadOnlySpan<char>. O objetivo é evitar alocações desnecessárias no heap.
CA1830: StringBuilder.Append(char)
A regra detecta chamadas como StringBuilder.Append(new string(char, int)). Em seguida, sugere o uso direto de StringBuilder.Append(char), que é mais eficiente.
CA1876: AsParallel() em foreach
Essa regra identifica chamadas de AsParallel() em loops foreach que anulam o paralelismo. O foreach consome os itens de forma sequencial, então o custo do PLINQ entra sem trazer o benefício esperado.
É um erro sutil, mas com impacto significativo em performance. Por isso, vale revisar os pontos que o analisador apontar.
CA1877: Path.Combine e Path.Join aninhados
A regra detecta chamadas aninhadas como Path.Combine(Path.Combine(a, b), c). Então, sugere consolidar tudo em uma única chamada, o que reduz alocações e chamadas de função.
public string GetFilePath(string folder, string subfolder, string fileName)
{
// Violação: duas chamadas consecutivas
string temp = Path.Combine(folder, subfolder);
return Path.Combine(temp, fileName);
}
public string GetFilePathFixed(string folder, string subfolder, string fileName)
{
// Correção: uma única sobrecarga com todos os segmentos
return Path.Combine(folder, subfolder, fileName);
}
CA2026: JsonElement.Parse
Se você usa JsonDocument.Parse() apenas para acessar o RootElement, o analisador sugere JsonElement.Parse diretamente. Esse método surgiu no .NET 10 e evita o JsonDocument intermediário.
O detalhe importa porque JsonDocument implementa IDisposable e aluga arrays do ArrayPool<T>. Quando ninguém faz o dispose, a pressão sobre o GC aumenta.
public static void ProcessJson(string json)
{
// Violação: o JsonDocument nunca recebe Dispose
JsonElement before = JsonDocument.Parse(json).RootElement;
// Correção: parse direto para JsonElement
JsonElement after = JsonElement.Parse(json);
}
CA2027: Task.Delay não cancelável em Task.WhenAny
A última regra identifica cenários em que Task.Delay aparece sem CancellationToken dentro de Task.WhenAny. Esse padrão é comum para implementar timeouts.
Sem o token, o Task.Delay continua rodando mesmo depois que o WhenAny completa. Isso desperdiça recursos e pode virar fonte de bugs.
O exemplo abaixo, escrito para este artigo, ilustra a correção. Nele, o cancelamento libera o timer assim que o download termina primeiro.
public static async Task<string?> DownloadWithTimeoutAsync(HttpClient client, string url)
{
using var cts = new CancellationTokenSource();
Task<string> download = client.GetStringAsync(url);
// Com o token, o delay pode ser cancelado quando o download termina antes
Task delay = Task.Delay(TimeSpan.FromSeconds(3), cts.Token);
Task finished = await Task.WhenAny(download, delay);
cts.Cancel();
return finished == download ? await download : null;
}
PublishReferenceSymbols no .NET 11 Preview 1
A nova propriedade MSBuild PublishReferenceSymbols controla se os arquivos .pdb de projetos referenciados entram na saída de publicação. Ela complementa PublishDocumentationFile, PublishReferencesDocumentationFiles e CopyOutputSymbolsToPublishDirectory.
<PropertyGroup>
<!-- Inclui os arquivos .pdb de projetos referenciados na saída de publicação -->
<PublishReferenceSymbols>true</PublishReferenceSymbols>
</PropertyGroup>
Se você precisa de stack traces detalhados em produção, essa propriedade simplifica a configuração do dotnet publish. O mesmo vale para soluções com muitos projetos, onde copiar símbolos manualmente dá trabalho.
Outras mudanças no SDK do .NET 11 Preview 1
Além dos destaques, o .NET 11 Preview 1 trouxe dois ajustes menores. Ambos resolvem incômodos antigos de quem usa a CLI fora de um ambiente em inglês ou com apps baseados em arquivo.
Opt-out da codificação UTF-8 no console
O MSBuild configura automaticamente a codificação do console para UTF-8. Contudo, em sistemas em japonês ou chinês, isso pode gerar texto ilegível quando você redireciona a saída para um pipe.
A nova variável de ambiente DOTNET_CLI_FORCE_UTF8_ENCODING permite desativar esse comportamento:
# No Windows (cmd)
set DOTNET_CLI_FORCE_UTF8_ENCODING=false
dotnet build
Apps baseados em arquivo com o mesmo comportamento de projetos
Aplicações baseadas em arquivo, como em dotnet build app.cs, agora seguem os mesmos padrões de verbosidade de projetos tradicionais. Assim, a saída fica igual à de dotnet build MyProject.csproj.
Esse alinhamento parece pequeno, mas evita surpresas. Afinal, quem começa com um arquivo solto e depois migra para um projeto espera a mesma experiência.
Resumo das novidades
A tabela abaixo reúne as mudanças do SDK no .NET 11 Preview 1, para consulta rápida.
| Recurso | O que mudou |
|---|---|
dotnet run |
Seleção interativa de target framework e dispositivo para .NET MAUI |
dotnet test |
Argumentos posicionais, sem necessidade de --project |
dotnet watch |
Hot Reload aceita novas referências sem reiniciar |
dotnet watch |
Porta WebSocket configurável via DOTNET_WATCH_AUTO_RELOAD_WS_PORT |
dotnet format |
Suporte à severidade hidden |
| Code analyzers | CA1517, CA1830, CA1876, CA1877, CA2026 e CA2027 |
PublishReferenceSymbols |
Inclui PDBs de projetos referenciados na publicação |
| UTF-8 | Opt-out via DOTNET_CLI_FORCE_UTF8_ENCODING |
Os previews seguintes continuaram esse trabalho. Por exemplo, o artigo sobre as novidades do MSBuild no mesmo preview cobre a camada de build, e o texto sobre o SDK no Preview 7 mostra até onde o ciclo chegou.
Vale testar o .NET 11 Preview 1?
O .NET 11 tem lançamento final previsto para novembro de 2026, como uma versão STS com dois anos de suporte. Portanto, um preview não é indicado para produção.
Por outro lado, testar cedo traz vantagens claras. Você descobre problemas nos seus scripts, valida o fluxo com MAUI e ainda pode reportar falhas enquanto a equipe do .NET ajusta o comportamento.
Uma boa estratégia é instalar o .NET 11 Preview 1 em paralelo ao SDK atual. Com um global.json por repositório, você controla qual versão cada projeto usa.
Conclusão
O .NET 11 Preview 1 mostra um SDK mais preocupado com o ciclo interno de desenvolvimento. O dotnet run interativo e o Hot Reload com novas referências atacam justamente as pausas que mais quebram a concentração.
Ao mesmo tempo, os seis analyzers novos levam boas práticas de performance para o build, sem esforço extra. Já as melhorias em dotnet test, dotnet format e publicação deixam a CLI mais previsível.
Se você trabalha com MAUI, contêineres ou soluções grandes, vale experimentar o .NET 11 Preview 1 desde já. Assim, quando a versão final chegar em novembro, a migração tende a ser bem mais tranquila.
FAQ
O dotnet run interativo quebra meus scripts?
Não, porque em terminais não interativos o comando não abre menu. Ele exibe um erro formatado com os frameworks disponíveis, e você continua usando --framework normalmente.
Preciso de MAUI para usar --device e --list-devices?
Não necessariamente. Qualquer projeto que implemente o target ComputeAvailableDevices participa da seleção de dispositivos.
O Hot Reload aceita qualquer referência nova?
O preview suporta adicionar PackageReference e ProjectReference durante a sessão do dotnet watch. Mudanças que o Roslyn não consegue aplicar continuam pedindo reinício, como nas rude edits.
Os novos analyzers geram erros de build?
Segundo a documentação, CA1877 e CA2026 vêm habilitadas como sugestão, e você ajusta a severidade de qualquer regra no .editorconfig. Assim, cada time decide se quer tratá-la como aviso ou erro.
Quando o .NET 11 será lançado?
A versão final está prevista para novembro de 2026, como STS com dois anos de suporte.