在写命令行程序的时候,会遇到命令行解析的问题,以及参数的使用和规范化等坑。现在社区开源了命令行项目,可以帮助小伙伴快速开发命令行程序,支持自动的命令行解析和规范的参数
我写过一篇关于命令行解析的博客C#命令行解析工具 但是这个方法不是很好用
在社区找到了 System.CommandLine 这是一个还在开发过程的很好用的一个库,里面用了很多很黑的写法
我创建了一个项目,我删除了原来的 Main 函数,使用下面的代码替换原来的 Main 函数,然后居然是可以编译通过运行的
当然在开始之前我需要安装两个 Nuget 库
- System.CommandLine.DragonFruit
- System.CommandLine.Rendering
可以通过创建一个 dotnet core 项目,编辑项目文件,添加下面代码
现在尝试使用 dotnet 命令行运行,请使用下面代码
在 dotnet 命令使用 --
分割调用的参数,也就是在 --
后面的参数将会传递到程序里面
于是就相当于运行了测试项目,传入参数 --name 林德熙 --text 是逗比
可以看到输出
这个例子的项目请看测试程序
当然命令行的参数写法有很多,上面的程序也支持下面的参数
当然一个命令行程序,如果就一个 exe 发给小伙伴,那么小伙伴怎么知道如何使用?在软件工程里面,在这一行默认的就是输入 --help
就输出帮助信息
于是我在主函数添加一点注释
此时输入 dotnet run -- --help
就可以看到下面代码
那么这个库是如何做黑科技让你的主函数可以修改参数的?
打开System.CommandLine.DragonFruit.targets 就可以看到 GenerateRealEntryPointType 修改启动项目
修改 StartupObject 可以指定调用的主函数是哪个类里的
创建动态代码写入到 obj
文件夹里面的 xx.g.cs 文件,写入下面代码
因为运行的启动函数就是 AutoGeneratedProgram 里面的主函数,所以其实你写的主函数不是主函数
如果想自己也修改主函数,请看Roslyn 通过 NuGet 库修改应用程序入口函数
想知道这个库是如何做的,请看源代码dotnet/command-line-api: System.CommandLine: Command line parsing, invocation, and rendering of terminal output.
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。 欢迎转载、使用、重新发布,但务必保留文章署名 林德熙 (包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我 联系。