C# (.NET) 的 CLI 框架:System.CommandLine 和 Spectre.Console

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

CLI框架用于C# (.NET):System.CommandLine 和 Spectre.Console



在C#中创建高质量的控制台应用程序(CLI)不仅需要处理命令行参数,还需要方便的数据展示、子命令支持、验证和交互性。在.NET生态系统中,有两个强大的工具可以实现这一目标:微软官方的System.CommandLine和通用库Spectre.Console。在本文中,我们将详细分析它们的功能,展示使用示例并比较它们的方法。



1. System.CommandLine:微软官方解析器



System.CommandLine是一个开源库,提供了一种声明式的方式来定义命令、参数、选项和处理程序。它从.NET 6开始包含在.NET SDK中,并作为NuGet包提供。



主要功能

  • 使用属性或fluent API声明式描述命令结构。
  • 自动生成帮助信息(--help)。
  • 支持嵌套命令(子命令)和别名。
  • 参数和选项验证(类型、范围、必填项)。
  • 与DI容器和中间件集成。


示例:包含两个命令的简单应用程序

让我们创建一个支持greet和calc命令的控制台应用程序。



using System.CommandLine;

var rootCommand = new RootCommand("多功能CLI应用程序");

// greet命令var greetCommand = new Command("greet", "问候用户");var nameOption = new Option<string>( "--name", () => "世界", "用于问候的名称");greetCommand.AddOption(nameOption);

greetCommand.SetHandler((string name) =>{ Console.WriteLine($"你好, {name}!");}, nameOption);

// calc命令var calcCommand = new Command("calc", "简单计算器");var aArgument = new Argument<int>("a", "第一个数字");var bArgument = new Argument<int>("b", "第二个数字");var operationOption = new Option<string>( "--operation", () => "add", "操作:add, sub, mul, div");calcCommand.AddArgument(aArgument);calcCommand.AddArgument(bArgument);calcCommand.AddOption(operationOption);

calcCommand.SetHandler((int a, int b, string op) =>{ var result = op switch { "add" => a + b, "sub" => a - b, "mul" => a * b, "div" => b != 0 ? a / b : throw new DivideByZeroException(), _ => throw new ArgumentException("未知操作") }; Console.WriteLine($"结果: {result}");}, aArgument, bArgument, operationOption);

rootCommand.AddCommand(greetCommand);rootCommand.AddCommand(calcCommand);

return await rootCommand.InvokeAsync(args);


运行应用程序:

dotnet run -- greet --name "PythonLib"dotnet run -- calc 10 5 --operation mul


2. Spectre.Console:美观与交互性



Spectre.Console是一个用于创建美观控制台界面的库。它并不替代参数解析器,而是很好地补充了它:彩色输出、表格、进度条、交互式菜单,甚至可以在控制台中绘图。



主要功能

  • 支持Markdown的彩色和格式化输出。
  • 表格、图表、日历。
  • 交互式组件:列表选择、文本输入、确认。
  • 动画(旋转器、进度条)。
  • 绘制边框、面板和列。


示例:交互式菜单和表格

让我们展示如何创建选择菜单并以表格形式输出数据。



using Spectre.Console;

// 交互式菜单var choice = AnsiConsole.Prompt( new SelectionProm

推荐