dotnet-exec 小工具

dotnet-exec 小工具

Intro

在之前的文章中很多会有一些示例代码,这些代码一般都是一些很小的示例,尤其是介绍一些新特性的示例,基本上不会引用其他包,只有 SDK 就可以执行,对于这些示例,一般会每个实例单独一个文件,示例程序的入口文件是 MainTest 方法,都用 Main 会造成冲突,所以用了另外一个名字,而 ProgramMain 方法里或者顶级程序语句中调用对应示例的 MainTest,这样的话每当我想只执行每一个示例的时候我就需要修改 Program 中的方法调用

b0a1f1e8fd4dc7a27ce61fd4e9e2f917.png

于是就想着写一个小工具,用来直接调用对应的示例,这样既不破坏原来 dotnet run 执行运行的效果,又可以直接执行某一个示例,今天开源的这个小工具 dotnet-exec 就是解决这个小问题的,下面来看一下如何使用以及如何实现的吧

GetStarted

首先需要安装 dotnet tool,dotnet tool 基于 .NET 6/7,需要安装 .NET 6 或者 .NET 7 SDK,SDK 安装之后

执行下面的命令即可安装

dotnet tool install -g dotnet-execute

对应的命令是 dotnet-exec,可以使用 dotnet-exec -h 来看支持的选项

cfbc8e149a2fedb1f9d1d9a9419bcb99.png

目前主要用到的 Options:

  • --entry 指定程序的入口,默认值是按我自己的习惯用的 MainTest,可以根据需要自定义,如果有 Main 方法会优先使用 Main 方法

  • --lang-version 指定 C# 语言版本,默认使用 Default 等同于 Latest,如果需要使用预览版特性需要指定为 Preview

  • --args/--arguments 指定用户需要传入的参数,等同于 Main 方法的 args 参数

  • -c/--configuration 指定编译的优化级别,默认是 Debug,不进行优化,可以指定为 Release

Sample

百闻不如一见,来看几个使用的示例吧:

这里是 C# 10 中的一个常量插值字符串的示例,从下图中可以看到代码里没有定义 Main 方法,定义了一个 MainTest 的静态方法,我们执行 dotnet-exec .\ConstantInterpolatedStringSample.cs 可以看到,执行了 MainTest 方法中的逻辑并且,输出了期望的结果

2959c5bf21bd7df99dcd72f0ea0f5a6d.png

这里是前段时间写的一个 C# 11 的一个新特性—— RawStringLiteral

95406ce2a9e5bd1e47aa9b74da735408.png

Raw String Literal

我们可以通过 dotnet-exec .\RawStringLiteral.cs --lang-version Preview 来执行这个示例,这里我们指定了 --lang-versionPreview 以启用还在 Preview 的语言特性

f0c7f46bec2f91547559274ee2809dfe.png

Raw String Literal Sample

针对原有的 Main 方法和顶级程序语句也是支持的,我们来看几个示例

097ff4f08bb78a8cc3870492701b6eb1.png

b839f5b2e2ed53d6bad021e6b9112ee2.png

Implement

它的实现原理其实比较简单,利用 Roslyn 去编译这个文件,增加了 Global using 的支持,并且会加上默认的 Global using,这样代码里可以简单一些,现在写的很多示例会启用隐式命名空间引用,这样会方便很多

首先会尝试编译为一个 Console 应用,顶级语句这种语法只支持 Console 应用,这样如果是顶级语句或者包含 Main 方法就和 dotnet run 的运行效果是一样的,如果没有 Main 方法,编译会报一个找不到 Main 方法的错误,然后会尝试编译为一个 dll 通过反射的方式调用自定义的入口,更多细节可以参考源码:https://github.com/WeihanLi/dotnet-exec/blob/1c83e366c81ab7a51e0995ed0f2a07845b668b89/src/dotnet-exec/CodeCompiler.cs#L38

More

目前只是做了比较简单处理,只编译了单个文件,而且没有检测项目中的包引用,如果有引用别的项目和文件,现在是不能处理的,后面可以解析文件所在的项目文件中的包引用依赖,编译整个项目,但是这样相对来说会复杂一些,实现起来可能不会走现在的方式了,后面有需求的话再说吧,暂时基本可以满足需要

如果你也有类似的需求,可以试一下看能否满足你的需要

References

  • https://github.com/WeihanLi/dotnet-exec

  • https://www.nuget.org/packages/dotnet-execute/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值