尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

免建项目直接运行 C:.NET 10 文件式应用(File-Based C Apps)完整实战指南

免建项目直接运行 C:.NET 10 文件式应用(File-Based C Apps)完整实战指南 免建项目直接运行 C#.NET 10 文件式应用File-Based C# Apps完整实战指南【免费下载链接】skillsRepository for skills to assist AI coding agents with .NET and C#项目地址: https://gitcode.com/GitHub_Trending/skills17/skills文件式 C# 应用File-Based C# Apps是 .NET 10 SDK 引入的能力允许直接用dotnet hello.cs运行一个.cs文件无需dotnet new console创建任何项目。本文基于当前仓库dotnet-advanced插件中的csharp-scriptsSkill见 SKILL.md完整讲解该能力的适用场景、#:指令系统、Unix shebang、AOT 下的 JSON 序列化方案、项目转换与旧版 SDK 降级路径并辅以仓库评测用例与源码佐证帮助你在语言实验、原型验证和小工具开发中彻底摆脱项目脚手架。一、这个 Skill 解决什么问题csharp-scripts是仓库 dotnet-advanced 插件下的四个高级技能之一其余为dotnet-pinvoke、nuget-trusted-publishing、vectorization定位是针对小众场景的进阶 .NET/C# 技能。它的核心主张是当用户明确想要 C#/.NET 代码、但又不想创建项目时用文件式应用来运行代码。适用场景When to Use快速验证某个 C# 概念、API 或语言特性用一个文件式应用跑通即可在大项目里集成之前先原型验证一段逻辑用一个入口文件加几个辅助.cs文件拼装一个小工具。不适用场景When Not to Use用户要的是与语言无关的临时脚本、一次性计算或 Shell/Python/PowerShell 风格的自动化用户需要完整项目、解决方案集成或在现有应用中添加项目引用用户正工作在某个已存在的 .NET 解决方案中想把代码加进去应用已经大到需要把项目结构、构建定制、测试或发布配置放进.csproj。一句话判断标准代码量适合文件而非项目时用文件式应用一旦需要构建定制、测试或发布配置就应该迁移到.csproj。唯一输入输入必填说明C# 代码或意图是要运行的代码或对文件式应用功能的描述仓库证据Skill 如何被评测仓库在 tests/dotnet-advanced/csharp-scripts/eval.yaml 中为这个 Skill 提供了能力评测type: capability。评测刺激词是测试 C# 语言特性询问 C# 是否支持创建stackalloc的Spannintnative-sized 整数。评测器断言命令以成功退出exit-success输出匹配(nint|nuint|native)输出包含stackalloc输出不匹配dotnet new console—— 即 Agent 必须走dotnet file.cs文件式路径而不是退化为建项目评分标准明确写着使用dotnet file.cs文件式应用运行测试而不是用dotnet new console创建完整项目。这个评测用例从侧面印证了本 Skill 的设计意图文件式应用不是没项目时的临时凑合而是被正式约定为 C# 语言实验的标准执行方式。二、环境前提SDK 版本与 Feature Band文件式应用对 SDK 版本有硬性要求开始前先执行dotnet --version判读规则文件式应用要求 .NET 10 或更高版本#:include、#:exclude以及跨文件的传递式transitive指令处理要求 SDK 10.0.300 或更高SDK 10.0.100 / 10.0.200 构建可以运行单文件应用但不支持上述多文件指令版本低于 10 时走本文第八节的旧版 SDK 降级方案。注意这里要区分运行时版本和SDK 功能带feature banddotnet --version输出的完整版本号如10.0.300中第二段300就是功能带它决定了指令能力的边界。一个 10.0.200 的 SDK 依然是 .NET 10但拿不到多文件指令。作为环境参考当前仓库根目录的 global.json 将 SDK 固定为11.0.100-previewrollForward: latestMajor高于 10.0.300 门槛因此在该仓库环境中文件式应用的全部指令均可用。三、最小工作流写文件 → 运行 → 传参 → 清理1. 写应用文件创建一个使用顶级语句top-level statements的入口.cs文件并放在任何现有项目目录之外避免与.csproj冲突#!/usr/bin/env dotnet // hello.cs Console.WriteLine(Hello from a file-based app!); var numbers new[] { 1, 2, 3, 4, 5 }; Console.WriteLine($Sum: {numbers.Sum()});文件组织规范使用顶级语句不要Main方法、类或命名空间的样板代码using指令放在文件顶部如果有 shebang 行和#:指令则放在它们之后类型声明类、record、enum放在所有顶级语句之后。2. 运行dotnet hello.csSDK 会自动完成构建并运行且结果会被缓存后续重复运行很快。需要传参时在--之后传入dotnet hello.cs -- arg1 arg2 multi word arg3. 清理会话结束后删除应用文件如需清掉缓存的构建产物dotnet clean hello.cs四、指令系统#:开头的声明式配置指令必须放在文件顶部可选的 shebang 行之后且必须在任何using指令或其他 C# 代码之前。所有指令都以#:开头。下面逐一说明六类指令。#:package— NuGet 包引用除非应用有意使用集中包管理CPM否则必须指定版本当接受最新可用版本时用*接受预发布版则用*-*#:package Humanizer2.14.1 using Humanizer; Console.WriteLine(hello world.Titleize());#:property— MSBuild 属性语法为#:property PropertyNameValue可在文件内设置任意 MSBuild 属性#:property AllowUnsafeBlockstrue #:property PublishAotfalse #:property NoWarnCS0162MSBuild 表达式与属性函数同样受支持例如#:property LogLevel$([MSBuild]::ValueOrDefault($(LOG_LEVEL), Information))常用属性速查属性用途AllowUnsafeBlockstrue启用unsafe代码PublishAotfalse关闭原生 AOT默认开启NoWarnCS0162;CS0219抑制特定警告LangVersionpreview启用预览语言特性InvariantGlobalizationfalse启用文化相关的全球化行为#:project— 项目引用按相对路径引用另一个项目#:project ../MyLibrary/MyLibrary.csproj#:ref— 文件式应用间的引用当某个.cs文件应当编译进独立的程序集而不是与入口文件同属一个编译单元时用#:ref建立类似项目引用的边界普通的辅助文件共享同一程序集应该用#:include。#:property ExperimentalFileBasedProgramEnableRefDirectivetrue #:ref ../Shared/Formatter.cs Console.WriteLine(Formatter.Title(hello world));使用要点被引用的文件会作为自己的虚拟项目编译并作为项目引用加入如果被引用文件是没有顶级语句的库需要在那个文件里加#:property OutputTypeLibrary引用方要消费的成员应为publicinternal成员跨程序集不可见#:ref是传递式的被引用文件里可以再包含自己的#:ref及其他#:指令相对路径按包含该指令的文件所在位置解析部分 SDK 构建需要#:property ExperimentalFileBasedProgramEnableRefDirectivetrue如果当前 SDK 不带该属性也接受#:ref可以移除这行。#:sdk— SDK 选择覆盖默认的Microsoft.NET.Sdk例如切换到 Web SDK#:sdk Microsoft.NET.Sdk.Web#:include与#:exclude— 多文件应用仅 .NET SDK 10.0.300 及以后支持。用#:include把辅助源文件和受支持的资源纳入同一个虚拟项目用#:exclude从 include 模式或默认条目集中剔除文件#!/usr/bin/env dotnet #:include Helpers.cs #:include Models/*.cs #:exclude Models/Generated/*.cs Console.WriteLine(Formatter.Title(hello world));使用要点传给dotnet的那个文件是入口点顶级语句写在那里类、record、enum 等声明放在被 include 的.cs文件中优先使用显式 glob如Helpers.cs、Models/*.cs避免宽泛的递归 glob路径按包含指令的文件所在目录解析非入口 C# 文件中的 include 指令同样会被处理辅助文件可以声明自己的#:package、#:property、#:sdk、#:project、#:ref、#:include或#:exclude除非指令类型明确支持重复避免跨文件重复声明指令——重复的#:package、#:property、#:sdk、#:include、#:exclude会导致失败使用#:include时在 Unix 系系统上给入口文件加 shebang#!/usr/bin/env dotnet以明确入口点shebang 文件要求LF行尾且无 BOM。一个典型的多文件布局scratch/ hello.cs Helpers.cs Models/ Person.cs#!/usr/bin/env dotnet // hello.cs #:include Helpers.cs #:include Models/*.cs var person new Person(Ada); Console.WriteLine(Formatter.Title(person.Name));// Helpers.cs static class Formatter { public static string Title(string value) value.ToUpperInvariant(); }// Models/Person.cs record Person(string Name);五、Unix shebang让.cs文件直接可执行在 Unix 平台上三步即可让.cs文件成为可执行文件文件第一行加 shebang#!/usr/bin/env dotnet Console.WriteLine(Im executable!);设置执行权限chmod x hello.cs直接运行./hello.cs注意shebang 文件必须使用LF行尾不要CRLF该指令在 Windows 上会被忽略。六、AOT 默认开启用源码生成 JSON 绕过反射限制文件式应用默认启用原生 AOT。在 AOT 下JsonSerializer.SerializeT(value)这类基于反射的 API 会在运行时失败因此必须改用源码生成source generation的序列化using System.Text.Json; using System.Text.Json.Serialization; var person new Person(Alice, 30); var json JsonSerializer.Serialize(person, AppJsonContext.Default.Person); Console.WriteLine(json); var deserialized JsonSerializer.Deserialize(json, AppJsonContext.Default.Person); Console.WriteLine($Name: {deserialized!.Name}, Age: {deserialized.Age}); record Person(string Name, int Age); [JsonSerializable(typeof(Person))] partial class AppJsonContext : JsonSerializerContext;要点定义一个继承JsonSerializerContext的partial类用[JsonSerializable]声明需要序列化的类型然后通过AppJsonContext.Default.Person拿到强类型的JsonTypeInfoPerson传给序列化 API。这正好与仓库另一个 Skillsystem-text-json-net11所强调的优先强类型JsonTypeInfoT方向一致。如果明确不需要 AOT也可以通过#:property PublishAotfalse关闭它见第四节属性表。七、升级为完整项目dotnet project convert当文件式应用长到需要项目结构、构建定制、测试或发布配置时一条命令即可原地转换dotnet project convert hello.cs转换后即可获得完整的.csproj项目进入常规的dotnet run、dotnet build、dotnet test、dotnet publish工作流。八、.NET 9 及更早版本的降级方案如果 SDK 版本低于 10文件式应用不可用。此时改用临时控制台项目mkdir -p /tmp/csharp-file-based-app cd /tmp/csharp-file-based-app dotnet new console -o . --force用应用内容替换生成的Program.cs然后用dotnet run运行需要 NuGet 包时用dotnet add package name添加用完删除该目录。九、验证清单Validation每次使用完文件式应用工作流对照以下清单自查dotnet --version报告 10.0 或更高否则走降级路径如果应用使用了#:include、#:exclude或来自被包含文件的传递式指令dotnet --version报告 SDK 10.0.300 或更高应用无错误编译可用dotnet build file.cs显式检查dotnet file.cs输出符合预期多文件应用包含所有必需的辅助文件并排除了意外匹配的文件会话结束后应用文件和缓存产物已清理。十、常见坑位速查表Common Pitfalls坑位解决方案.cs文件位于含有.csproj的目录中把应用移到项目目录之外或使用dotnet run --file file.cs#:package未指定版本指定版本#:package PackageName1.2.3或用*取最新#:property语法错误使用PropertyNameValue两侧无空格、不加引号#:property AllowUnsafeBlockstrue指令放在了 C# 代码之后所有#:指令必须紧跟可选 shebang 行之后且在任何using指令或其他 C# 语句之前辅助文件没有被编译在入口文件加#:include Helper.cs或合适的 glob共享文件需要程序集边界用#:ref Shared.cs而不是#:include Shared.cs被引用文件若无入口点则加#:property OutputTypeLibrary宽泛的 include 引入了无关文件优先窄 include 模式并用#:exclude排除生成文件、备份或实验文件包含文件间出现重复指令入口点与被包含 C# 文件中的 package、property、SDK、include、exclude 指令保持全局唯一反射式 JSON 序列化失败改用带JsonSerializerContext的源码生成 JSON见第六节出现意外的构建行为或版本错误文件式应用会继承父目录的global.json、Directory.Build.props、Directory.Build.targets和nuget.config若继承设置产生冲突把应用移到隔离目录十一、把 Skill 用对的验证方式综合来看csharp-scriptsSkill 的正确使用范式可以归纳为三条主线能力边界先行先确认 SDK 版本满足门槛10.0多文件指令需 10.0.300再决定是文件式应用还是降级到临时项目入口文件最小化顶级语句 顶部指令 辅助文件#:include全部声明类/record/enum下沉到被包含文件以评测为验收标准仓库评测eval.yaml明确要求通过dotnet file.cs运行实验代码并输出可验证的结果而非创建dotnet new console项目——这正是本 Skill 与普通写代码脚本式技能的分水岭。深入阅读可继续查看 Skill 原始定义 plugins/dotnet-advanced/skills/csharp-scripts/SKILL.md以及插件整体定位 plugins/dotnet-advanced/README.md 和插件清单 plugins/dotnet-advanced/plugin.json。【免费下载链接】skillsRepository for skills to assist AI coding agents with .NET and C#项目地址: https://gitcode.com/GitHub_Trending/skills17/skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表