用途:csharp-scripts 用于把单文件 C# 程序当作脚本运行,便于快速测试 C# 概念、API 或语言特性,以及在集成到大型项目之前先做逻辑原型。它不适合需要多文件或项目引用的完整工程,也不适合直接往已有 .NET 解决方案里加代码,或过于庞大复杂、单个文件难以容纳的程序。
主要能力:基于 .NET 10+ 的文件级应用,无需 Main 方法、class 或 namespace 样板,直接在 .cs 文件里写顶层语句。执行 dotnet hello.cs 会自动构建并运行,并有缓存加速后续运行。可通过 #:package 指令引用 NuGet 包,需指定版本,例如 #:package Humanizer@2.14.1。文件级应用默认启用 native AOT,因此应使用源生成的 JSON 序列化(JsonSerializerContext),基于反射的 JsonSerializer.Serialize<T> 在 AOT 下运行时会失败。
使用方式:先运行 dotnet --version 确认 SDK 已安装并记下主版本号,文件级应用要求 .NET 10 或更高;低于 10 则改用回退方案。创建单个 .cs 文件,放在已有项目目录之外以避免与 .csproj 冲突。用 dotnet hello.cs 运行;需要传参时用 -- 分隔,如 dotnet hello.cs -- arg1 arg2 "multi word arg"。在 Unix 平台可加 shebang #!/usr/bin/env dotnet,chmod +x hello.cs 后直接 ./hello.cs 运行,注意使用 LF 换行,该指令在 Windows 上被忽略。脚本变大时可用 dotnet project convert hello.cs 转成完整项目。完成后删除脚本文件,用 dotnet clean hello.cs 清除缓存的构建产物。
回退方案(.NET 9 及更早):文件级应用不可用,可创建临时控制台项目,例如 mkdir -p /tmp/csharp-script && cd /tmp/csharp-script,再 dotnet new console -o . --force,用脚本内容替换生成的 Program.cs 后 dotnet run,并用 dotnet add package <name> 添加包,完成后删除目录。
适用场景与限制:适合快速原型、概念验证和小型实验。常见问题包括:.cs 文件位于含 .csproj 的目录中会冲突,需移出或使用 dotnet run --file file.cs;#:package 必须带版本,可写 @* 表示最新;反射式 JSON 序列化会失败,需改用源生成;文件级应用会继承父目录的 global.json、Directory.Build.props、Directory.Build.targets 和 nuget.config,若继承配置冲突,应把脚本移到隔离目录。