con un clic
csharp-scripts
以脚本方式运行单文件 C# 程序,用于快速实验、原型验证和概念测试。当用户希望编写并执行一个小型 C# 程序而无需创建完整项目时使用。
Instalar con Codex o Claude Copia este prompt, pégalo en Codex, Claude u otro asistente, y deja que revise la página de la skill y la instale por ti.
Menú
以脚本方式运行单文件 C# 程序,用于快速实验、原型验证和概念测试。当用户希望编写并执行一个小型 C# 程序而无需创建完整项目时使用。
Instalar con Codex o Claude Copia este prompt, pégalo en Codex, Claude u otro asistente, y deja que revise la página de la skill y la instale por ti.
Madorin 插件开发入口技能。用于统一编排 Native、MCP、Process 三类通道,约束工程规范、外部包 AOT 校验、发布安装与运行时更新流程。触发关键词:插件开发、Native 插件、MCP 插件、Process 插件、进程插件、发布插件、安装插件。
Madorin Native 插件开发子技能。位置:subskills/native。用于 Native AOT 插件创建、Startup 组合、Tool 编写、JsonContext、后台服务、AOT 规则。触发关键词:Native 插件、AOT 插件、Startup.Configure、ToolAttribute、原生插件。
Madorin Process 插件开发子技能。位置:subskills/process。用于开发以独立 exe 进程运行的插件,支持 JIT self-contained 和 AOT exe 两种发布方式,通过 stdin/stdout JSON 协议与宿主通信。触发关键词:Process 插件、进程插件、exe 插件、JIT 插件、进程隔离插件。
Madorin PluginBus WebSocket 接入。用于生成 /internal 单端点、cortana.plugin-bus、conversation topic、chat.message.send、chat.generation.stop、system.notice、ping/pong 的 C# 客户端代码与样板。关键词:WebSocket、PluginBus、/internal、chat.message.send、ping、pong。
Madorin 插件工程规范子技能。位置:subskills/architecture。用于插件架构设计、职责分离、依赖注入、AOT 安全编码、配置与日志、质量门禁。触发关键词:插件架构、职责分离、依赖注入、工程规范、AOT 安全、插件设计。
Madorin MCP 通道子技能。位置:subskills/mcp。用于接入和校验外部 MCP Server 的 stdio、sse、streamable-http 配置。触发关键词:MCP、Model Context Protocol、stdio、sse、streamable-http。
Basado en la clasificación ocupacional SOC
| name | csharp-scripts |
| version | 1.0.3 |
| description | 以脚本方式运行单文件 C# 程序,用于快速实验、原型验证和概念测试。当用户希望编写并执行一个小型 C# 程序而无需创建完整项目时使用。 |
本技能处理以脚本形态运行的 C# 代码:
Main 方法、无 class Program 包装).csx 文件.cs 文件含 Main / class Program 的完整控制台程序交给标准项目工作流(dotnet new console + dotnet run),不走本技能。
不要为了"验证脚本形态"去读取脚本文件内容。 是不是合法脚本由运行时判断:执行成功即合法;失败即报错——把错误原样透给用户,不要预读内容浪费 token。
满足任一条件即启用:
.csx 或 .cs 文件路径并要求执行(直接执行,不预读文件内容)有两条独立的执行路径,互不相关:
csx_script 工具(首选)csx_script 是宿主上已经安装好的进程插件(打包为 exe),对外暴露若干工具;调用这些工具即可执行脚本,不需要本机装 .NET SDK,只需要 Runtime。
| 代码形态 | 调用的工具 |
|---|---|
| 单个表达式(无分号、无语句) | csx_eval |
| 多行脚本代码在内存里(字符串) | csx_run_str |
用户给出文件路径 / 代码 > 256 K 字符 / 需要 #load | csx_run_file(直接传路径,不读文件) |
多步任务需要跨调用共享变量、using、函数 | csx_session_create → csx_session_exec × N → csx_session_close |
| 用户明确要求「只检查不执行」 | csx_check |
| 用户明确要求格式化代码 | csx_format |
约束:
Log / Settings / Host,不要 using#r "nuget:Pkg, 1.2.3";若 get_info.instructions 提示宿主未装 SDK,改用不依赖该包的实现或改走方式 Bcsx_run_filedotnet 命令(回退)仅当 csx_script 工具不可用时使用:
dotnet --version ≥ 10 → dotnet <file>.cs(.cs 必须是顶级语句形式)引入 NuGet 包用 #:package Pkg@1.2.3(这是 CLI 专有指令,不要写在要交给 csx_script 的脚本里)。
按顺序判断,命中即停:
csx_script 工具是否可用?是 → 用方式 A禁止跳过第 1 步直接走方式 B。
直接把路径传给 csx_run_file(方式 A)或 dotnet <file>(方式 B),不要先读文件内容。文件是否是合法脚本由工具判断——成功就是成功,失败把报错返给用户即可。
只有当用户要求「修改 / 解释 / 调试」脚本时才读取内容;单纯执行不读。
代码已经在上下文里,按「什么是脚本」判断形态,选择合适的工具:单表达式用 csx_eval,多行用 csx_run_str,超长(>256K 字符)落盘后用 csx_run_file。
| 扩展名 | 方式 A(csx_run_file) | 方式 B(dotnet <file>) |
|---|---|---|
.csx | ✅ 原生支持 | ❌ 不支持 |
.cs(顶级语句) | ✅ 按 CSX 语义执行 | ✅ |
.cs(含 Main) | ⚠️ 交由工具判定,不预读 | —(项目工作流) |
| 其它 | ❌ | ❌ |
| 输入 | 是否必需 | 说明 |
|---|---|---|
| C# 代码或意图描述 | 是 | 要运行的代码,或对脚本功能的描述 |
运行 dotnet --version 确认 SDK 已安装,并记录主版本号。基于文件的应用需要 .NET 10 或更高版本。如果版本低于 10,请改用旧版 SDK 回退方案。
使用顶级语句创建单个 .cs 文件。将文件放在任何现有项目目录之外,以避免与 .csproj 文件冲突。
// hello.cs
Console.WriteLine("Hello from a C# script!");
var numbers = new[] { 1, 2, 3, 4, 5 };
Console.WriteLine($"Sum: {numbers.Sum()}");
编写指南:
Main 方法、类或命名空间样板代码)using 指令放在文件顶部dotnet hello.cs
自动构建并运行文件。已缓存,后续运行速度很快。在 -- 后传递参数:
dotnet hello.cs -- arg1 arg2 "multi word arg"
在文件顶部使用 #:package 指令引用 NuGet 包。务必指定版本号:
#:package Humanizer@2.14.1
using Humanizer;
Console.WriteLine("hello world".Titleize());
脚本分两类,处理方式不同:
| 类型 | 判定依据 | 执行完的处理 |
|---|---|---|
| 临时脚本 | 用户说「测试一下 / 跑一下 / 验证一下」;AI 为演示或一次性计算临时写的文件;放在 tmp/ temp/ %TEMP% 等临时目录 | 删除文件,必要时 dotnet clean <file>.cs |
| 长期脚本 | 用户明确保存到某个目录;已存在于项目 / 仓库 / scripts/ tools/ 等目录;用户提及「以后还要用 / 保留 / 加到 git」 | 不删除,仅在用户明确要求时执行清理 |
默认原则:不确定时默认保留,并提醒用户文件路径。删除动作不可逆,宁愧勿纵。
# 仅在临时脚本时执行:
dotnet clean hello.cs
Remove-Item hello.cs
在 Unix 平台上,可以让 .cs 文件直接可执行:
在文件第一行添加 shebang:
#!/usr/bin/env dotnet
Console.WriteLine("I'm executable!");
设置执行权限:
chmod +x hello.cs
直接运行:
./hello.cs
添加 shebang 时使用 LF 换行符(非 CRLF)。此指令在 Windows 上会被忽略。
基于文件的应用默认启用原生 AOT。基于反射的 API(如 JsonSerializer.Serialize<T>(value))在 AOT 下运行时会失败。请改用源代码生成的序列化:
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;
当脚本超出单文件的承载能力时,将其转换为完整项目:
dotnet project convert hello.cs
如果 .NET SDK 版本低于 10,则基于文件的应用不可用。请改用临时控制台项目:
mkdir -p /tmp/csharp-script && cd /tmp/csharp-script
dotnet new console -o . --force
将生成的 Program.cs 替换为脚本内容,然后使用 dotnet run 运行。使用 dotnet add package <name> 添加 NuGet 包。临时项目执行完后可删除该目录;若用户要求保留,保留即可。
dotnet --version 报告 10.0 或更高版本(或已使用回退方案)dotnet build <file>.cs 显式检查)dotnet <file>.cs 产生预期输出| 问题 | 解决方案 |
|---|---|
.cs 文件位于包含 .csproj 的目录中 | 将脚本移到项目目录之外,或使用 dotnet run --file file.cs |
#:package 未指定版本 | 指定版本:#:package PackageName@1.2.3 或 @* 表示最新版 |
| 基于反射的 JSON 序列化失败 | 使用源代码生成的 JSON 和 JsonSerializerContext(参见源代码生成的 JSON) |
| 意外的构建行为或版本错误 | 基于文件的应用会继承父目录中的 global.json、Directory.Build.props、Directory.Build.targets 和 nuget.config。如果继承的设置冲突,请将脚本移到隔离目录 |
参阅 https://learn.microsoft.com/en-us/dotnet/core/sdk/file-based-apps 获取基于文件的应用的完整参考。