做网站 学php哪一部分,网页美工设计培训学什么,南京软件外包公司有哪些,四川网站建设设计dotnet-exec 小工具Intro在之前的文章中很多会有一些示例代码#xff0c;这些代码一般都是一些很小的示例#xff0c;尤其是介绍一些新特性的示例#xff0c;基本上不会引用其他包#xff0c;只有 SDK 就可以执行#xff0c;对于这些示例#xff0c;一般会每个实例单独一… dotnet-exec 小工具Intro在之前的文章中很多会有一些示例代码这些代码一般都是一些很小的示例尤其是介绍一些新特性的示例基本上不会引用其他包只有 SDK 就可以执行对于这些示例一般会每个实例单独一个文件示例程序的入口文件是 MainTest 方法都用 Main 会造成冲突所以用了另外一个名字而 Program 的 Main 方法里或者顶级程序语句中调用对应示例的 MainTest这样的话每当我想只执行每一个示例的时候我就需要修改 Program 中的方法调用于是就想着写一个小工具用来直接调用对应的示例这样既不破坏原来 dotnet run 执行运行的效果又可以直接执行某一个示例今天开源的这个小工具 dotnet-exec 就是解决这个小问题的下面来看一下如何使用以及如何实现的吧GetStarted首先需要安装 dotnet tooldotnet tool 基于 .NET 6/7需要安装 .NET 6 或者 .NET 7 SDKSDK 安装之后执行下面的命令即可安装dotnet tool install -g dotnet-execute对应的命令是 dotnet-exec可以使用 dotnet-exec -h 来看支持的选项目前主要用到的 Options--entry 指定程序的入口默认值是按我自己的习惯用的 MainTest可以根据需要自定义如果有 Main 方法会优先使用 Main 方法--lang-version 指定 C# 语言版本默认使用 Default 等同于 Latest如果需要使用预览版特性需要指定为 Preview--args/--arguments 指定用户需要传入的参数等同于 Main 方法的 args 参数-c/--configuration 指定编译的优化级别默认是 Debug不进行优化可以指定为 ReleaseSample百闻不如一见来看几个使用的示例吧这里是 C# 10 中的一个常量插值字符串的示例从下图中可以看到代码里没有定义 Main 方法定义了一个 MainTest 的静态方法我们执行 dotnet-exec .\ConstantInterpolatedStringSample.cs 可以看到执行了 MainTest 方法中的逻辑并且输出了期望的结果这里是前段时间写的一个 C# 11 的一个新特性—— RawStringLiteralRaw String Literal我们可以通过 dotnet-exec .\RawStringLiteral.cs --lang-version Preview 来执行这个示例这里我们指定了 --lang-version 为 Preview 以启用还在 Preview 的语言特性Raw String Literal Sample针对原有的 Main 方法和顶级程序语句也是支持的我们来看几个示例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#L38More目前只是做了比较简单处理只编译了单个文件而且没有检测项目中的包引用如果有引用别的项目和文件现在是不能处理的后面可以解析文件所在的项目文件中的包引用依赖编译整个项目但是这样相对来说会复杂一些实现起来可能不会走现在的方式了后面有需求的话再说吧暂时基本可以满足需要如果你也有类似的需求可以试一下看能否满足你的需要Referenceshttps://github.com/WeihanLi/dotnet-exechttps://www.nuget.org/packages/dotnet-execute/