- Desde .NET 10 Preview 4, ahora se agregó una función que permite ejecutar un solo archivo C# directamente con
dotnet run app.cs, haciendo posible ejecutar código C# incluso sin archivo de proyecto
- Gracias a las aplicaciones basadas en archivos (file-based apps), ahora es mucho más fácil ejecutar scripts simples, hacer pruebas y experimentar ideas, como en Python o JavaScript
- También se pueden gestionar dentro del archivo, mediante directivas, cosas como referencias a paquetes NuGet, definición del SDK y configuración de propiedades de compilación, lo que mejora la flexibilidad de desarrollo
- Con soporte para shebang, también se puede usar en sistemas tipo Unix para utilidades CLI, scripts de automatización y más
- Si hace falta, se puede convertir sin fricción a una aplicación basada en proyecto, conectando de forma natural desde aprendizaje y prototipos hasta desarrollo formal de aplicaciones
Qué es dotnet run app.cs
- Antes, para ejecutar código C# con la CLI de
dotnet, era obligatorio tener una estructura de proyecto (.csproj)
- Ahora se puede ejecutar directamente con un solo archivo .cs, lo que reduce mucho la barrera de entrada
- Es adecuado para varios usos, como lenguajes de scripting, automatización, experimentación y aprendizaje
- Gracias a la integración con la CLI, se puede usar de inmediato con solo tener
dotnet, sin instalar herramientas adicionales
- Si el código crece, se puede ampliar a una app basada en proyecto usando el mismo lenguaje y las mismas herramientas
Soporte para directivas a nivel de archivo
- En las apps basadas en archivos también se pueden declarar directamente en el archivo .cs las configuraciones principales del proyecto mediante directivas
-
Referencia a paquetes NuGet
- Con la directiva
#:package se pueden referenciar directamente paquetes NuGet
-
Definición del SDK
- Con la directiva
#:sdk se puede especificar el tipo de SDK
-
Configuración de propiedades de MSBuild
- Con
#:property se pueden definir directamente propiedades de compilación
-
Soporte de shebang para scripts de shell
- Si se agrega
#!/usr/bin/dotnet run al inicio del archivo, se puede usar directamente como ejecutable en sistemas tipo Unix
Conversión a una app basada en proyecto
Diferencias frente al método tradicional de scripts en C#
- Hasta ahora era posible ejecutar scripts C# con herramientas de la comunidad como CS-Script, dotnet-script y Cake, pero requerían instalación y configuración por separado
- Ahora, sin instalación adicional ni modos especiales, se puede ejecutar código de inmediato usando el mismo compilador y el mismo lenguaje de C#, reduciendo la barrera de entrada
Cómo empezar
- Instalar .NET 10 Preview 4
- Si usas Visual Studio Code, necesitas instalar C# Dev Kit y la versión prerelease más reciente de la extensión C# (2.79.8 o superior)
- Crear un archivo
.cs y escribir el código directamente
- Ejecutar
dotnet run hello.cs en la terminal
- Si hace falta, convertirlo en proyecto con
dotnet project convert hello.cs
Más información
Próximos planes
- Está previsto mejorar el soporte para apps basadas en archivos dentro de VS Code y el IntelliSense para directivas, además de mejorar el rendimiento y reforzar el soporte de depuración
- También se están desarrollando funciones adicionales, como soporte para múltiples archivos y mejoras en la velocidad de ejecución
dotnet run app.cs hace que C# sea más accesible, manteniendo intacta toda la potencia de .NET
- Proporciona una base para pasar más rápido del prototipado y la enseñanza al desarrollo en producción
4 comentarios
La experiencia de DX que ofrece autocompletado basado en File-based App ya está disponible en la versión más reciente de la extensión de C#, pero originalmente Microsoft no publicaba la extensión en ningún lugar fuera de VS Code Marketplace.
Para resolver esa incomodidad, hice que solo la parte de C# Extension —no C# Dev Kit— (la parte con licencia MIT) se autobuildee y autopublique por separado, la registré en OpenVSX y comparto un video de demostración simple basado en Kiro.
https://www.youtube.com/watch?v=pIi7CWOPQSA
Cuando antes usaba la función de C# Interactive, no se podían usar paquetes que no estuvieran instalados localmente, pero parece que ahora ya lo mejoraron.
Comentarios en Hacker News
npm run <command>go run github.com/kardianos/json/cmd/jsondiff@v1.0.1; es una función bastante genialdotnet runya cachea el resultado de compilación, así que no hace falta una capa de caché aparte (para desactivarlo,--no-build; para ver la ruta del binario, usa--artifacts-path)*.main.ktspara que funcione). Este enfoque es muy bueno para scripts pequeños o para prototipado, y también es práctico para aprovechar funciones de la JVM. Aun así, para scripts pequeños Ruby sigue siendo lo más cómodo, especialmente al ejecutar programas externos, porque la sintaxis de backticks es muy prácticadotnet run <file>sí funcionaba; después de actualizar ya quedó bien. El problema era que el archivo usaba saltos de línea CRLF en vez de LF#!/usr/local/share/dotnet/dotnet runo#!/usr/bin/env -S dotnet runen el shebang.dump(). Estedotnet runmás bien parece una herramienta que podría complementarlo. Antes trabajé en lugares donde odiaban PowerShell con pasión, y allí resolvían casi todo el scripting con LINQPad; en ambientes así sí resultaba útildotnet rundesde VSCode o Visual Studio comparada con LINQPad. La gran fortaleza de LINQPad es la visualización de resultados; sidotnet runsolo imprime texto o requiere muchos plugins aparte, LINQPad seguirá teniendo demanda. Para cosas como revisar sintaxis, eso sí,dotnet runpodría ser una mejor opción; yo también a veces pruebo sintaxis en LINQPad cuando se me cruzan los cablesTambién hice dos ejemplos reales relacionados con esta función, así que los comparto en una respuesta. Son códigos de ejemplo de apps GUI para Windows y macOS usando un servidor MCP y Avalonia. 😊
https://forum.dotnetdev.kr/t/…