Como executar arquivos C# diretamente com `dotnet run app.cs`
(devblogs.microsoft.com)- 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
#:packagepermite referenciar diretamente pacotes NuGet- Exemplo:
#:package Humanizer@2.14.1 using Humanizer; var dotNet9Released = DateTimeOffset.Parse("2024-12-03"); var since = DateTimeOffset.Now - dotNet9Released; Console.WriteLine($"It has been {since.Humanize()} since .NET 9 was released.");
- Exemplo:
- A diretiva
-
Definição de SDK
- A diretiva
#:sdkpermite definir o tipo de SDK- Exemplo:
#:sdk Microsoft.NET.Sdk.Web - Também é possível habilitar recursos do ASP.NET Core (Minimal API, MVC etc.)
- Exemplo:
- A diretiva
-
Configuração de propriedades do MSBuild
- Com
#:property, é possível definir diretamente propriedades de build- Exemplo:
#:property LangVersion preview
- Exemplo:
- Com
-
Suporte a shebang para scripts de shell
- Ao colocar
#!/usr/bin/dotnet runno topo do arquivo, ele pode ser usado diretamente como arquivo executável em sistemas Unix- Exemplo:
#!/usr/bin/dotnet run Console.WriteLine("Hello from a C# script!"); - Após dar permissão de execução, basta executar:
chmod +x app.cs ./app.cs
- Exemplo:
- Ao colocar
Conversão para app baseado em projeto
- Quando o app crescer ou precisar de mais recursos, é possível converter facilmente para um projeto com o comando
dotnet project convert app.cs - As diretivas são convertidas automaticamente em propriedades do arquivo
.csproj, referências e afins -
Exemplo de conversão
- Um arquivo como este:
#:sdk Microsoft.NET.Sdk.Web #:package Microsoft.AspNetCore.OpenApi@10.*-* var builder = WebApplication.CreateBuilder(); builder.Services.AddOpenApi(); var app = builder.Build(); app.MapGet("/", () => "Hello, world!"); app.Run();
- Um arquivo como este:
-
- Resultado da conversão:
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>net10.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="10.*-*" /> </ItemGroup> </Project>
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
.cse 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.cstorna 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/…