C#怎么创建命令行工具 System.CommandLine库使用方法

来源:这里教程网 时间:2026-02-21 17:39:07 作者:

System.CommandLine
创建 C# 命令行工具,核心是定义命令、选项、参数,再绑定处理逻辑——它比手动解析
args
更清晰,也比传统
Console.ReadLine()
交互更专业。

安装 System.CommandLine

在项目中通过 NuGet 安装最新稳定版(推荐 v2.0.0-beta4 或更高):

CLI 方式:
dotnet add package System.CommandLine --version 2.0.0-beta4
或在 .csproj 中添加:
<packagereference include="System.CommandLine" version="2.0.0-beta4"></packagereference>

注意:v2 是当前主推版本,API 更统一,文档和示例也以 v2 为主;避免混用 v1(已归档)。

定义基础命令和选项

RootCommand
开始,用
Option<t></t>
添加开关,用
Argument<t></t>
接收位置参数:

var root = new RootCommand("我的工具:处理文本文件");
var inputOpt = new Option<string>("--input", "输入文件路径") { IsRequired = true };
var verboseOpt = new Option<bool>("--verbose", "显示详细日志");
<p>root.AddOption(inputOpt);
root.AddOption(verboseOpt);</p><p>root.SetHandler((input, verbose) =>
{
Console.WriteLine($"处理文件:{input}");
if (verbose) Console.WriteLine("详细模式已启用");
}, inputOpt, verboseOpt);

关键点:
-

SetHandler
绑定执行逻辑,参数顺序必须与
AddOption
/
AddArgument
传入顺序一致
- 选项名支持短格式(如
-i
)和长格式(
--input
),可同时注册:
new Option<string>("-i", "--input", ...)</string>

支持子命令(如 git commit / push)

Command
创建子命令,再挂到根命令下:

var commitCmd = new Command("commit", "提交更改");
var messageOpt = new Option<string>("--message", "提交信息");
commitCmd.AddOption(messageOpt);
commitCmd.SetHandler(msg => Console.WriteLine($"提交:{msg}"), messageOpt);
<p>root.AddCommand(commitCmd);</p><p>// 运行:dotnet run -- commit --message "feat: add login"

子命令可嵌套多层,适合功能复杂的 CLI 工具(比如

dotnet tool restore
中的
tool
是命令,
restore
是其子命令)。

自动帮助与错误提示

无需手写

--help
逻辑,
System.CommandLine
默认支持:

运行
dotnet run -- --help
→ 显示根命令帮助
运行
dotnet run -- commit --help
→ 显示
commit
子命令帮助
参数缺失、类型错误时自动报错并提示正确用法

还可自定义帮助文本:

root.Description = "一个轻量级文件处理器"
,或为选项加说明:
inputOpt.Description = "必填:UTF-8 编码的 .txt 文件"

基本上就这些。不复杂但容易忽略的是 handler 参数顺序和 option 注册顺序必须严格对应——写错会导致运行时报

ArgumentException
。其他高级用法(如自定义类型转换、中间件管道、国际化)可按需查官方文档。

相关推荐