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 ...
随机推荐
- 【攻克RabbitMQ】常见问题
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/zlt995768025/article/ ...
- 浅谈Uep分页查询
<hy:ajaxgrid id="unitGrid" showpagerbar="true" name="unitWrap" show ...
- P1200 [USACO1.1]你的飞碟在这儿Your Ride Is He…
P1200 [USACO1.1]你的飞碟在这儿Your Ride Is He… 大写祖母转数字 -64 发现dalao #include<bits/stdc++.h> usi ...
- 阶段3 3.SpringMVC·_01.SpringMVC概述及入门案例_03.入门程序之需求分析
- linux LVM分区查看dm设备
linux LVM分区查看dm设备 在linux中iostat -d查看磁盘状态时,有的会有如下dm-0,dm-1的条目. Device: tps kB_read/s ...
- 微信小程序 ----- this.getOpenerEventChannel is not a function
小程序 添加新的功能, 页面跳转后,通过事件的发布订阅,实现 from => to 或者 to=> from 数据传递 1. 跳转到指定页面. 通过 wx.navigateTo() .请参 ...
- lambda得用法
- ArrayList(顺序表)和LinkedList(链表)的区别联系,优劣取舍问题
ArrayList和LinkedList都是List接口的实现类.主要区别如下: 最主要的区别是底层的数据结构不同: 1)ArrayList相当于一个动态数组,需要随机访问列表中的元素时,ArrayL ...
- hdoj4507(数位dp)
题目链接:https://vjudge.net/problem/HDU-4507 题意:定义如果一个整数符合下面3个条件之一,那么我们就说这个整数和7有关—— 1.整数中某一位是7: 2.整数的每一位 ...
- sql server优化方向?
系列转自KK:https://www.cnblogs.com/double-K/ Expert 诊断优化系列------------------你的CPU高么? Expert 诊断优化系列------ ...