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.pswp.cn/news/280513.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/280513.shtml
英文地址,請注明出處:http://en.pswp.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…