You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#的System.CommandLine中重写或移除默认--version选项?

重写System.CommandLine中--version的默认行为

在使用System.CommandLine时,默认的--version选项只显示应用自身版本,满足不了技术支持需要的详细信息(比如.NET运行时版本、插件版本等),可以通过以下两种方式修改:

方法一:移除默认选项,自定义新的--version

先把框架自带的--version选项删掉,再自己加一个带自定义逻辑的同名选项:

using System.CommandLine;
using System.CommandLine.Builder;
using System.CommandLine.Parsing;
using System.Reflection;

var rootCommand = new RootCommand("你的应用功能描述");

// 定位并移除默认的--version选项
var defaultVersionOpt = rootCommand.Options.FirstOrDefault(o => o.Name == "version");
if (defaultVersionOpt != null)
{
    rootCommand.RemoveOption(defaultVersionOpt);
}

// 添加自定义的--version选项
var customVersionOpt = new Option<bool>("--version", "显示包含运行时、插件的详细版本信息");
rootCommand.AddOption(customVersionOpt);

// 绑定自定义处理逻辑
rootCommand.SetHandler((showVersion) =>
{
    if (showVersion)
    {
        // 获取应用版本
        var appVer = Assembly.GetEntryAssembly()?.GetName().Version?.ToString() ?? "未知版本";
        // 获取当前.NET运行时版本
        var runtimeVer = Environment.Version.ToString();
        // 实际项目中替换成真实的插件版本获取逻辑
        var pluginVersions = new Dictionary<string, string>
        {
            ["支付插件"] = "2.1.0",
            ["日志插件"] = "1.5.3"
        };

        Console.WriteLine($"应用版本: {appVer}");
        Console.WriteLine($".NET运行时版本: {runtimeVer}");
        Console.WriteLine("已启用插件版本:");
        foreach (var plugin in pluginVersions)
        {
            Console.WriteLine($"  - {plugin.Key}: {plugin.Value}");
        }
        Environment.Exit(0);
    }
}, customVersionOpt);

// 构建并启动命令行处理
await new CommandLineBuilder(rootCommand)
    .UseDefaults()
    .Build()
    .InvokeAsync(args);

方法二:直接重写默认选项的处理程序

不需要移除默认选项,直接找到它并替换处理逻辑,更简洁:

using System.CommandLine;
using System.CommandLine.Builder;
using System.CommandLine.Parsing;
using System.Reflection;

var rootCommand = new RootCommand("你的应用功能描述");

// 找到默认的--version选项
var defaultVersionOpt = rootCommand.Options.FirstOrDefault(o => o.Name == "version") as Option<bool>;
if (defaultVersionOpt != null)
{
    // 替换默认的处理逻辑
    defaultVersionOpt.SetHandler(() =>
    {
        var appVer = Assembly.GetEntryAssembly()?.GetName().Version?.ToString() ?? "未知版本";
        var runtimeVer = Environment.Version.ToString();
        var pluginVersions = new Dictionary<string, string>
        {
            ["支付插件"] = "2.1.0",
            ["日志插件"] = "1.5.3"
        };

        Console.WriteLine("=== 详细版本信息 ===");
        Console.WriteLine($"应用版本: {appVer}");
        Console.WriteLine($".NET运行时版本: {runtimeVer}");
        Console.WriteLine("插件版本列表:");
        foreach (var plugin in pluginVersions)
        {
            Console.WriteLine($"  * {plugin.Key}: {plugin.Value}");
        }
        Environment.Exit(0);
    });
}

// 构建并启动命令行处理
await new CommandLineBuilder(rootCommand)
    .UseDefaults()
    .Build()
    .InvokeAsync(args);

注意事项

  • 插件版本的获取逻辑需要根据你的项目实际情况调整,比如从配置文件、插件程序集里读取
  • 两种方法都能达到目的,方法二更适合只改输出内容的场景,方法一适合需要修改选项描述、添加别名(比如-v)的情况

内容的提问来源于stack exchange,提问作者Tom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 15:55:55