微软在 .NET 10 Preview 4 中引入了一项彻底改变开发者与C#交互方式的特性——历史上首次,开发者可以直接通过 dotnet run app.cs
执行C#文件,无需创建项目文件、搭建目录结构或管理MSBuild配置。
这项范式转移使C#在保持企业级能力的同时,获得了脚本语言的灵活性。
✔️ 官方发布说明解析
在 .NET 10 Preview 4 之前,通过 dotnet CLI 执行C#代码必须依赖包含 .csproj 文件的项目结构。这种要求在实际开发中形成了阻碍,往往导致管理开销超过实际编码工作量。全新的基于文件的应用程序功能完全消除了这一障碍。
其实现原理是在后台创建隐式项目文件。当执行 dotnet run hello.cs
时,.NET 运行时会动态生成必要的项目结构,编译代码并执行,整个过程不会在磁盘上持久化任何额外文件。
该特性在保持与现有.NET生态系统完全兼容的同时,提供了现代开发工具应有的即时性体验。
✔️ 文件级指令:强大而不失简洁 .NET 10 引入了可直接嵌入.cs文件的文件级指令,解决了单文件开发的核心挑战——在不牺牲简洁性的前提下访问外部依赖和配置。
#:package 包管理指令
通过 #:package
指令可直接引用NuGet包:
#: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."); 该指令消除了传统.NET开发中繁琐的包管理流程,开发者可以快速试验库功能、构建原型和创建实用工具。
#:sdk SDK指定指令 不同应用类型需要不同的SDK:
#:sdk Microsoft.NET.Sdk.Web
var builder = WebApplication.CreateBuilder();
builder.AddOpenApi();
var app = builder.Build();
app.MapGet("/", () => "Hello, world!");
app.Run();
该指令使文件级应用能充分利用专业SDK的全部能力,如ASP.NET Core的Minimal API、依赖注入和中间件管道等功能。
#:property MSBuild属性指令
通过 #:property
指令配置MSBuild属性:
#:property LangVersion preview
// 启用预览版语言特性
string message = "Advanced C# features enabled";
Console.WriteLine(message);
开发者无需创建项目文件即可配置语言版本、目标框架等构建行为。
✔️ Shebang支持实现跨平台脚本 通过在类Unix系统中支持Shebang行,C#成为一等脚本语言:
#!/usr/bin/dotnet run
Console.WriteLine("Hello from a C# script!");
使用 chmod +x app.cs
赋予执行权限后,可直接运行:./app.cs
。这使得C#成为系统管理、DevOps自动化和跨平台工具开发的有力竞争者。
✔️ 生产环境考量与用例场景 • 开发与原型设计:算法开发、API试验等快速迭代场景 • 教育领域:学生可专注语言概念而非项目管理 • 自动化脚本:基础设施管理、部署脚本等场景 • 数据集成:JSON处理、HTTP操作等数据转换任务
✔️ 项目转换与演进路径
通过 dotnet project convert app.cs
命令可无缝转换为传统项目结构,自动生成.csproj文件并将指令转换为等效的MSBuild配置。
✔️ 开发环境集成 Visual Studio Code通过C# Dev Kit扩展(2.79.8+版本)提供对文件级应用的完整支持,包括:
✔️ 性能与架构考量 文件级应用采用与传统.NET应用相同的编译执行基础设施,性能特征完全一致。隐式项目生成带来的启动开销对大多数应用而言可忽略不计。
✔️ 未来路线图 微软计划进一步:
这项变革不仅提升了开发便利性,更从根本上改变了C#在开发生态中的定位——既能胜任脚本语言的传统领域,又保持企业级能力。从单文件到企业应用的平滑演进路径,确保了开发投入的可持续性。
每个C#开发者都应该尽快尝试这一特性,它带来的简捷性与强大功能的结合,将为创新、教育和生产力提升开启新的可能。问题不在于是否要采用这一特性,而在于您能以多快的速度将其整合到开发生态中。