dotnet-exec 让 C# 程序更简单

dotnet-exec 让 C# 程序更简单

Intro

dotnet-exec是一个可以执行 C# 程序而不需要项目文件的命令行工具,并且你可以指定自定义的入口方法不仅仅是Main方法

在 python/NodeJs 里,可以使用python xx.py/node xx.js来运行代码,在 C# 中一般是需要项目文件才能dotnet run运行代码,这对于一些比较简单的代码来说会显得麻烦很多,而dotnet-exec则可以用来简化这一场景,使得我们可以没有项目文件也可以运行,我们就可以直接dotnet-execxx.cs除此之外我们也可以自定义代码的入口方法不限于Main方法,而且我们可以直接执行源代码和远程文件代码

How it works

6bf8c6f3372b5e7c53429800b018932b.png

工作流程分为三步:

  • 获取代码:目前支持本地代码、远程代码以及原始代码

  • 代码编译:Roslyn 完成代码动态编译

  • 代码执行:基于 AssemblyLoadContext 的代码执行

核心实现是基于 Roslyn 来完成动态编译ff3373407a9e02d3ac47e6ca35396713.png

编译的时候分成三种情况

  • 一种是代码是有Main方法的Console应用,直接执行 Main 方法即可

  • 一种是没有 Main 方法的 DLL,需要自定义入口方法,执行自定义的入口方法

  • 最后是Script代码是由Roslyn的Scripting功能进行支持进行编译和执行

    abb100e3f0e54bf804967bf1fd72a91b.png

Install/Update

最新的稳定版本:

dotnet tool update -g dotnet-execute

最新的预览版本:

dotnet tool update -g dotnet-execute --prerelease

Docker 支持

使用 docker 执行

docker run --rm weihanli/dotnet-exec:latest dotnet-exec "1+1"
docker run --rm weihanli/dotnet-exec:latest dotnet-exec "Guid.NewGuid()"
docker run --rm --pull=always weihanli/dotnet-exec:latest dotnet-exec "ApplicationHelper.RuntimeInfo"

完整的 tag 列表请参考 https://hub.docker.com/r/weihanli/dotnet-exec/tags

除了 latest tag 你也可以使用 0.12.0 这样的版本 tag,docker 版本 tag 只发布稳定版本

Examples

Get started

执行本地文件:

dotnet-exec HttpPathJsonSample.cs

执行本地文件并且自定义入口方法:

dotnet-exec 'HttpPathJsonSample.cs' --entry MainTest

详细示例:

8d7da27a0fd62061a56d3a3a61528f2d.png

执行远程文件:

dotnet-exec 'https://github.com/WeihanLi/SamplesInPractice/blob/master/net7Sample/Net7Sample/ArgumentExceptionSample.cs'

远程文件这里做了一些优化,会将 Github/Gist/Gitee上的文件地址自动转换成原始内容地址,以下两种方式效果一样

336bfeb5059fb2422c9e0f5c2b16b095.png

执行原始代码:

dotnet-exec 'Console.WriteLine(1+1);'

执行原始脚本:

dotnet-exec 'script:1+1'
dotnet-exec 'Guid.NewGuid()'

References

执行原始代码并自定义程序集引用:

NuGet 包引用:

dotnet-exec 'CsvHelper.GetCsvText(new[]{1,2,3}).Dump();' -r "nuget: WeihanLi.Npoi,2.3.0" -u "WeihanLi.Npoi"

本地 dll 引用:

dotnet-exec 'CsvHelper.GetCsvText(new[]{1,2,3}).Dump();' -r "./out/WeihanLi.Npoi.dll" -u "WeihanLi.Npoi"

本地目录下的 dll 引用:

dotnet-exec 'CsvHelper.GetCsvText(new[]{1,2,3}).Dump();' -r "folder: ./out" -u "WeihanLi.Npoi"

本地项目引用:

dotnet-exec 'CsvHelper.GetCsvText(new[]{1,2,3}).Dump();' -r "project: ./WeihanLi.Npoi.csproj" -u "WeihanLi.Npoi"

框架引用:

dotnet-exec 'WebApplication.Create().Run();' --reference 'framework:web'

使用--web一个选项来添加 web 框架引用:

dotnet-exec 'WebApplication.Create().Run();' --web

一行代码实现 web api

82244485b7ee178afdf72e5d2cea2957.png

一行代码使用 winform 弹出窗口cf149015c25b41519cd2a34e4ae0369f.png

Usings

执行原始代码并且自定义命名空间引用:

dotnet-exec 'WriteLine(1+1);' --using "static System.Console"

执行原始脚本并且自定义命名空间引用:

dotnet-exec 'CsvHelper.GetCsvText(new[]{1,2,3}).Dump()' -r "nuget:WeihanLi.Npoi,2.4.2" -u WeihanLi.Npoi

c8c788cc036f34f21614f63e8ac84e24.png

其他示例

执行原始代码并且指定更多依赖:

dotnet-exec 'typeof(LocalType).FullName.Dump();' --ad FileLocalType2.cs
dotnet-exec 'typeof(LocalType).FullName.Dump();' --addition FileLocalType2.cs

执行原始代码并且指定从项目文件中提取 using 信息和 reference 信息:

dotnet-exec 'typeof(LocalType).FullName.Dump();' --project ./Sample.csproj

执行本地文件并指定启用预览特性:

dotnet-exec RawStringLiteral.cs --preview

Config Profile

你可以自定义常用的配置到一个 profile 配置里以方便重复使用,使用帮助可以参考命令行帮助311d914bee52299a77360b3d3ead9cbd.png

列出所有可用的 profile 配置:

dotnet-exec profile ls

配置一个 profile:

dotnet-exec profile set web -r "nuget:WeihanLi.Web.Extensions" -u 'WeihanLi.Web.Extensions' --web --wide false

获取一个 profile 配置详情:

dotnet-exec profile get web

移除不需要的 profile 配置:

dotnet-exec profile rm web

d08444e0bb5a94a45e0bd758a45436e8.png执行代码时指定某一个 profile 配置:

dotnet-exec 'WebApplication.Create().Chain(_=>_.MapRuntimeInfo()).Run();' --profile web
910f6cd7376203a7aa039a52aed6ddab.png执行代码时指定某一个 profile 配置并且移除配置中的某一个 using:
dotnet-exec 'WebApplication.Create().Run();' --profile web --using '-WeihanLi.Extensions'

More

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

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

  • https://hub.docker.com/r/weihanli/dotnet-exec

  • https://github.com/WeihanLi/dotnet-exec/blob/main/docs/slides/dotnet-conf-china-2022-dotnet-exec_makes_csharp_more_simple.pdf

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/280513.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

office数据集dslr_如何将照片从DSLR无线传输到智能手机

office数据集dslrYou’ve got a great digital camera. You’ve got all your social media apps on your phone. Wouldn’t it be nice if you could snap a beautiful shot with your DSLR and shuttle it right over to your phone to throw up on Facebook or Instagram? …

文件管理、命令别名和glob

一、复制命令:cp src dest1.如果scr是文件a.如果dest不存在,则新建dest并将src的内容填充到dest里b.如果dest存在,则会用src里的内容覆盖dest里的内容,即覆盖dest2.如果src是目录a.如果dest不存在,则新建dest,然后把src下的内容复…

大数据汇聚全球精英

投资10亿美元,选址贵安新区,建设iCloud服务的中国主数据中心。7月12日苹果公司的这一举动再次将全球目光聚集在贵州。 “贵州有令人瞩目的增长,是中国新数据中心领域最具发展潜力的地点之一。”苹果公司环境、政策和社会事务副总裁丽萨杰克逊…

django版本区别/与版本匹配

一、区别 路由层 1.django 1.x路由层使用url方法 django 2.x和3.x版本使用path方法 url() 第一个参数支持正则 path()第一个参数是不支持正则的 可以使用 re_path替代url() from django.urls import re_path # django2.0中的re_path #不建议导入url,不能区分版本 #from djang…

复制

ab,像这样的复制,本质上a与b引用的是同一对象,当a改变时相应的b也会做出同样的改变; 对于列表和字典这样的容器对象分为:浅层复制blist(a)和深层复制bcopy.deepcopy(a) 浅层复制对对象共有的元素进行改变时同时改变; 深…

天坑,这样一个lambda随机取数据也有Bug

前几天,一位网友跟我说他编写的一段很简单的代码遇到了奇怪的Bug,他要达到的效果是从一个List中随机取出来一条数据,代码如下:var random new Random(); var users Enumerable.Range(0, 10).Select(p > new User(p, "A&…

中兴面试一个星期没有回音_如何在没有回声的情况下从亚马逊获取即时时尚建议...

中兴面试一个星期没有回音The Echo Look is a new device from Amazon that’s able to take a look at your outfits and tell you which one looks the best on you. However, you actually don’t need the Echo Look to get this kind of instant fashion advice from Amaz…

table分页的简单实现逻辑

为什么80%的码农都做不了架构师&#xff1f;>>> //table分页函数showPageNum: function(pageNum, allPageNum) { //pageNum点击第几页&#xff0c;allPageNum总页数$(".c_page .c_page_list").children().remove();for(var i1;i<allPageNum;i){var p…

django22:复制网页与css/时区设置

复制网页 1.复制文章 右击——检测——选中——复制——copy outerhtml (整体html) 2.复制点赞点踩 a.复制html b.css也要复制 如果是模板&#xff0c;在html head内 {% block css %}{% endblock %} 网页 {% block css %}<style>#div_digg {float: right;margin-…

Cocos Creator Ui系统

为什么80%的码农都做不了架构师&#xff1f;>>> 游戏场景&#xff1a;开发时组织游戏内容的中心&#xff1b;其中渲染根节点Canvas&#xff0c;包括属性 Design Resolution&#xff08;设计分辨率&#xff09; fit width,fit height 设计分辨率是内容生产者在制作场…

关于spring boot多张表建立外健的讨论

现在有四张表&#xff1a;student(学生表)、blogs(博客表)、comment(评论表)、reply(回复表) 现在说一下这四张表&#xff1a; student(学生表)&#xff1a;学生的信息记录表 blogs(博客表)&#xff1a;学生发表的博客表 comment(评论表)&#xff1a;学生评论博客文章的表 repl…

推荐一个使用 .NET 6 开发的开源媒体系统

你好&#xff0c;这里是 Dotnet 工具箱&#xff0c;定期分享 Dotnet 有趣&#xff0c;实用的工具和组件&#xff0c;希望对您有用&#xff01;什么是 Jellyfin ?Jellyfin 是一个免费的媒体系统&#xff0c;它可以让您更好的管理媒体&#xff0c;包括电影&#xff0c;音乐&…

亚马逊echo中国使用_如何将Amazon Echo与蓝牙扬声器配对以获得更大的声音

亚马逊echo中国使用Although both the full size Echo and the Echo Dot have respectable sound for their given sizes, compared to much bigger tabletop Bluetooth speakers (or a full home theater system with Bluetooth support), they’re pretty anemic. Let’s loo…

如何用Markdown轻松排版知乎专栏文章?

免费、便捷、高效的知乎专栏Markdown排版技巧。希望读过本文&#xff0c;可以让你的写作过程也变得更愉悦。 痛点 从前&#xff0c;写作时的排版是件辛苦事。不论你把排版环节放在写作中还是写作后&#xff0c;总会在心里清楚意识到&#xff0c;还有这么一个繁重而无趣的工作在…

Python FastApi:post文件与数据/本地端测试

FastAPI快速搭建 1 .uvicorn模块用于启动FastAPI&#xff0c;可以自定义端口&#xff0c;方便快速启动&#xff0c;特别适合pycharm启动。 2.app.post(/file/)自定义定义访问路径。 3. get_keyword_position() 内是需要输入的参数&#xff0c;包含文件和变量。普通变量建议…

德国巴伐利亚山谷积雪遍地 汽车被大雪掩埋

当地时间1月24日&#xff0c;德古南部巴伐利亚一座村庄里&#xff0c;小汽车被大雪掩埋&#xff0c;只露出一角窗户。当地时间2019年1月24日&#xff0c;德国加尔米施-帕滕基兴&#xff0c;积雪遍地。图为一名滑雪者在雪道上滑雪。当地时间2019年1月24日&#xff0c;德国加尔米…

macbook图形化编程_如何判断MacBook使用的是哪种图形芯片(并进行切换)

macbook图形化编程Apple’s top end MacBook Pros come with two graphics chips: an integrated Intel Iris Pro chip and a discrete graphics card with more power. That way, you can use the integrated chip when you need better battery life, and the more powerful …

跨集群流量调度实现 Kubernetes 集群金丝雀升级

有了多集群服务和跨集群的流量调度之后&#xff0c;使用 Kubernetes 的方式会发生很大的变化。流量的管理不再限制单一集群内&#xff0c;而是横向跨越了多个集群。最重要的是这一切“静悄悄地”发生&#xff0c;对应用来说毫无感知。就拿 Kubernetes 版本升级来说吧。记得曾经…

usr/bin/expect方式免密码登录和发送文件脚本

2019独角兽企业重金招聘Python工程师标准>>> ssh 登录 #!/usr/bin/expect set timeout 20 if { [llength $argv] < 3} { puts "Usage:" puts "remote_host password cmd" exit 1 } set remote_host [lindex $argv 0] set passwor…

8-[多线程] 进程池线程池

1、为甚需要进程池&#xff0c;线程池 介绍官网&#xff1a;https://docs.python.org/dev/library/concurrent.futures.htmlconcurrent.futures模块提供了高度封装的异步调用接口 ThreadPoolExecutor&#xff1a;线程池&#xff0c;提供异步调用 ProcessPoolExecutor: 进程池&a…