2019-11-29-dotnet-使用-System.CommandLine-写命令行程序
| title | author | date | CreateTime | categories |
|---|---|---|---|---|
|
dotnet 使用 System.CommandLine 写命令行程序
|
lindexi
|
2019-11-29 08:33:49 +0800
|
2019-04-20 17:22:15 +0800
|
dotnet
|
在写命令行程序的时候,会遇到命令行解析的问题,以及参数的使用和规范化等坑。现在社区开源了命令行项目,可以帮助小伙伴快速开发命令行程序,支持自动的命令行解析和规范的参数
我写过一篇关于命令行解析的博客C#命令行解析工具 但是这个方法不是很好用
在社区找到了 System.CommandLine 这是一个还在开发过程的很好用的一个库,里面用了很多很黑的写法
我创建了一个项目,我删除了原来的 Main 函数,使用下面的代码替换原来的 Main 函数,然后居然是可以编译通过运行的
static void Main(string name, string text)
{
Console.WriteLine($"{name}{text}");
}
当然在开始之前我需要安装两个 Nuget 库
- System.CommandLine.DragonFruit
- System.CommandLine.Rendering
可以通过创建一个 dotnet core 项目,编辑项目文件,添加下面代码
<ItemGroup>
<PackageReference Include="System.CommandLine.DragonFruit" Version="0.2.0-alpha.19174.3" />
<PackageReference Include="System.CommandLine.Rendering" Version="0.2.0-alpha.19174.3" />
</ItemGroup>
现在尝试使用 dotnet 命令行运行,请使用下面代码
dotnet run -- --name 林德熙 --text 是逗比
在 dotnet 命令使用 -- 分割调用的参数,也就是在 -- 后面的参数将会传递到程序里面
于是就相当于运行了测试项目,传入参数 --name 林德熙 --text 是逗比 可以看到输出
林德熙是逗比
这个例子的项目请看测试程序
当然命令行的参数写法有很多,上面的程序也支持下面的参数
dotnet run -- --name:林德熙 --text:是逗比
当然一个命令行程序,如果就一个 exe 发给小伙伴,那么小伙伴怎么知道如何使用?在软件工程里面,在这一行默认的就是输入 --help 就输出帮助信息
于是我在主函数添加一点注释
/// <summary>
/// 欢迎访问我的博客 http://blog.lindexi.com 从入门到精通
/// </summary>
/// <param name="name">逗比名</param>
/// <param name="text">逗比</param>
static void Main(string name, string text)
此时输入 dotnet run -- --help 就可以看到下面代码
DallairhacelKurbegofa:
欢迎访问我的博客 http://blog.lindexi.com 从入门到精通 Usage:
DallairhacelKurbegofa [options] Options:
--name <NAME> 逗比名
--text <TEXT> 逗比
--version Display version information
那么这个库是如何做黑科技让你的主函数可以修改参数的?
打开System.CommandLine.DragonFruit.targets 就可以看到 GenerateRealEntryPointType 修改启动项目
修改 StartupObject 可以指定调用的主函数是哪个类里的
<PropertyGroup>
<StartupObject>AutoGeneratedProgram</StartupObject>
</PropertyGroup>
创建动态代码写入到 obj 文件夹里面的 xx.g.cs 文件,写入下面代码
// <auto-generated>This file was created automatically</auto-generated>
using System.CommandLine.DragonFruit;
using System.Runtime.CompilerServices;
using System.Threading.Tasks; [CompilerGenerated]
internal class AutoGeneratedProgram
{
public static async Task<int> Main(string[] args)
{
return await CommandLine.ExecuteAssemblyAsync(
entryAssembly: typeof(global::AutoGeneratedProgram).Assembly,
args: args);
}
}
因为运行的启动函数就是 AutoGeneratedProgram 里面的主函数,所以其实你写的主函数不是主函数
如果想自己也修改主函数,请看Roslyn 通过 NuGet 库修改应用程序入口函数
想知道这个库是如何做的,请看源代码dotnet/command-line-api: System.CommandLine: Command line parsing, invocation, and rendering of terminal output.
2019-11-29-dotnet-使用-System.CommandLine-写命令行程序的更多相关文章
- dotnet 使用 System.CommandLine 写命令行程序
在写命令行程序的时候,会遇到命令行解析的问题,以及参数的使用和规范化等坑.现在社区开源了命令行项目,可以帮助小伙伴快速开发命令行程序,支持自动的命令行解析和规范的参数 我写过一篇关于命令行解析的博客C ...
- C# 借助CommandLine 写命令行工具 在数据库中创建job
首先需要用到 CommandLine.dll 提供两个下载链接,云盘是我自己上传的,也就是我在用的 http://commandline.codeplex.com/ https://pan.baid ...
- 2019-8-31-dotnet-使用-System.CommandLine-写命令行程序
title author date CreateTime categories dotnet 使用 System.CommandLine 写命令行程序 lindexi 2019-08-31 16:55 ...
- 手写笔记变PDF-几行代码变命令行程序为图形化界面
前言 最近发现了一个非常不错的Python类库----Gooey, https://github.com/chriskiehl/Gooey 在它的帮助下我们可以非常方便的将一个命令行程序升级成一个图形 ...
- UNIX环境编程学习笔记(22)——进程管理之system 函数执行命令行字符串
lienhua342014-10-15 ISO C 定义了 system 函数,用于在程序中执行一个命令字符串.其声明如下, #include <stdlib.h> int system( ...
- pycharm+anaconda在Mac上的配置方法 2019.11.29
内心os: 听人说,写blog是加分项,那他就不是浪费时间的事儿了呗 毕竟自己菜还是留下来东西来自己欣赏吧 Mac小电脑上进行python数据开发环境的配置 首先下载Anaconda,一个超好用的数据 ...
- 2019.11.29 Mysql的数据操作
为名为name的表增加数据(插入所有字段) insert into name values(1,‘张三’,‘男’,20); 为名为name的表增加数据(插入部分字段) insert into name ...
- 2019.11.29 SAP SMTP郵件服務器配置 發送端 QQ郵箱
今天群裏的小夥伴問了如何配置郵件的問題,隨自己在sap裏面配置了一個 1. RZ10配置參數 a) 参数配置前,先导入激活版本 执行完毕后返回 b) 输入参数文件DEFAU ...
- Supervision meeting notes 2019/11/29
topic 分支: 1. subgraph/subsequence mining Wang Jin, routine behavior/ motif. Philippe Fournier Viger ...
随机推荐
- C++类的默认成员函数
成员函数隐含this指针参数: 每成员函数一个隐式的指针形参(构造函数除外): 对象在调用成员函数时,编译器会将对象的地址传递给this指针: 1.构造函数(需用一个公有成员函数对私有的成员变量进行初 ...
- 初学vue 在做项目时遇到的问题与解决办法(使用element组件)(二)
表格每行里都有按钮 <el-table-column prop="option" label="操作" align="center" ...
- 在jsp中出现:Syntax error, insert "Finally" to complete TryStatement错误
在jsp中出现:Syntax error, insert "Finally" to complete TryStatement错误 可能括号不匹配{}
- 模糊查询基于select遍历json文件自动填充的实现
HTML页面 <tr> <td align="left"><span>案由</span> <input type=" ...
- RTX和谐说明
1.下载安装原版RTX20152.打开“服务”,停止RTX开头的服务.3.替换C:\Program Files\Tencent\RTXServer\License目录下的License.ini文件:替 ...
- java:异常机制(try,catch,finally,throw,throws,自定义异常)
* String类中的格式化字符串的方法: * public static String format(String format, Object... args):使用指定的格式字符串和参数返回一个 ...
- CoverflowJS
coverflow是苹果首创的将多首歌曲的封面以3D界面的形式显示出来的方式 GitHub地址:[https://github.com/coverflowjs/coverflow] 下载地址:[htt ...
- 华为HCNA乱学Round 2:路由基础
- 一篇文章看懂Java并发和线程安全(一)
一.前言 长久以来,一直想剖析一下Java线程安全的本质,但是苦于有些微观的点想不明白,便搁置了下来,前段时间慢慢想明白了,便把所有的点串联起来,趁着思路清晰,整理成这样一篇文章. 二.导读 1.为什 ...
- Android-Widget桌面小组件
1, 掌握Widget的用:Widget的用途,能够添加到手机桌面的程序 2, Widget的特点和用法步骤: 特点:快捷,方便,个性化,可自定义功能,可及时控制更新Widget显示内容 3, 用法步 ...