- A partir do .NET 10 Preview 4, foi adicionada a capacidade de executar um único arquivo C# diretamente com
dotnet run app.cs, permitindo rodar código C# mesmo sem arquivo de projeto
- Graças aos file-based apps, ficou muito mais fácil executar scripts simples, fazer testes e experimentar ideias, como em Python ou JavaScript
- Referências a pacotes NuGet, definição de SDK e configuração de propriedades de build também podem ser gerenciadas por meio de diretivas dentro do arquivo, aumentando a flexibilidade no desenvolvimento
- Com suporte a shebang, também pode ser usado em utilitários de CLI, scripts de automação e afins em sistemas Unix
- Se necessário, é possível converter de forma fluida para um app baseado em projeto, conectando naturalmente aprendizado e prototipagem ao desenvolvimento completo de aplicações
O que é dotnet run app.cs
- Antes, para executar código C# com a CLI do
dotnet, era obrigatória uma estrutura de projeto (.csproj)
- Agora, é possível executar diretamente com apenas um arquivo .cs, reduzindo bastante a barreira de entrada
- É adequado para vários usos, como linguagens de script, automação, experimentação e aprendizado
- Com a integração à CLI, dá para usar imediatamente só com o
dotnet, sem instalar ferramentas extras
- Se o código crescer, ele pode ser expandido para um app baseado em projeto usando a mesma linguagem e as mesmas ferramentas
Suporte a diretivas em nível de arquivo
- Mesmo em apps baseados em arquivo, as principais configurações de projeto podem ser declaradas diretamente no arquivo .cs por meio de diretivas
-
Referência a pacotes NuGet
- A diretiva
#:package permite referenciar diretamente pacotes NuGet
-
Definição de SDK
- A diretiva
#:sdk permite definir o tipo de SDK
-
Configuração de propriedades do MSBuild
- Com
#:property, é possível definir diretamente propriedades de build
-
Suporte a shebang para scripts de shell
- Ao colocar
#!/usr/bin/dotnet run no topo do arquivo, ele pode ser usado diretamente como arquivo executável em sistemas Unix
Conversão para app baseado em projeto
Diferença em relação às abordagens anteriores de script em C#
- Até agora, era possível executar scripts em C# com ferramentas da comunidade (CS-Script, dotnet-script, Cake etc.), mas isso exigia instalação e configuração de ferramentas separadas
- Agora, sem instalação extra nem modo especial, é possível executar código imediatamente usando o mesmo compilador e a mesma linguagem C#
Como começar
- Instale o .NET 10 Preview 4
- Se usar o Visual Studio Code, é preciso instalar o C# Dev Kit e a versão prerelease mais recente da extensão C# (2.79.8 ou superior)
- Crie um arquivo
.cs e comece a escrever código imediatamente
- No terminal, execute
dotnet run hello.cs
- Se necessário, converta para projeto com
dotnet project convert hello.cs
Saiba mais
Planos futuros
- Estão previstos suporte a apps baseados em arquivo dentro do VS Code, melhorias no IntelliSense para diretivas, ganho de desempenho e reforço no suporte a depuração
- Recursos adicionais, como suporte a múltiplos arquivos e melhorias na velocidade de execução, também estão em desenvolvimento
dotnet run app.cs torna o C# muito mais acessível, mantendo toda a força do .NET
- Isso cria uma base para migrar mais rapidamente da prototipagem e educação para o desenvolvimento em produção
4 comentários
A DX que oferece a experiência de autocompletar baseada em File-based App já está disponível na versão mais recente da extensão C#, mas originalmente a Microsoft não publicava a extensão em lugares além do VS Code Marketplace.
Para resolver esse incômodo, fiz com que apenas a parte da C# Extension, e não o C# Dev Kit (a parte sob licença MIT), fosse autobuild/autopublish separadamente e a registrei no OpenVSX; com base nisso, compartilho um vídeo simples de demonstração baseado no Kiro.
https://www.youtube.com/watch?v=pIi7CWOPQSA
Quando usei o recurso C# Interactive antes, não dava para usar pacotes que não estavam instalados localmente, mas parece que isso melhorou agora.
Comentários do Hacker News
npm run <command>go run github.com/kardianos/json/cmd/jsondiff@v1.0.1; é um recurso bem legaldotnet runjá faz cache do resultado da compilação, então não precisa de uma camada extra de cache (para desativar use--no-build, e para ver o caminho do binário use--artifacts-path)*.main.kts); esse estilo é ótimo para scripts pequenos e prototipagem, e também é prático para aproveitar recursos da JVM. Ainda assim, para scripts pequenos, Ruby continua sendo o mais confortável, especialmente por causa da sintaxe com crases para executar programas externosdotnet run <file>funcionava. Depois de uma atualização passou a funcionar normalmente, e a causa do problema era que o arquivo usava fim de linha CRLF em vez de LF#!/usr/local/share/dotnet/dotnet runou#!/usr/bin/env -S dotnet runno shebang.dump(). Essedotnet runnovo talvez funcione mais como um complemento para isso. Antigamente trabalhei num lugar que odiava PowerShell a ponto de fazer praticamente todo o scripting com LINQPad, e nesse tipo de ambiente ele era útildotnet runno VSCode ou no Visual Studio, e o quão parecida ela será com a do LINQPad. O ponto forte do LINQPad é a visualização de resultados; sedotnet runsó imprimir texto ou exigir muitos plugins extras, a demanda por LINQPad deve continuar. Já para conferir sintaxe e coisas do tipo,dotnet runpode ser a melhor opção; eu mesmo às vezes testo sintaxe no LINQPadTambém criei 2 exemplos reais relacionados a esse recurso e estou compartilhando na resposta. São códigos de exemplo de aplicativos GUI para Windows e macOS usando servidor MCP e Avalonia. 😊
https://forum.dotnetdev.kr/t/…