使用CoreRT将.NET Core发布为Native应用程序
在上一篇文章《使用.NET Core快速開發(fā)一個(gè)較正規(guī)的命令行應(yīng)用程序》中我們看到了使用自包含方式發(fā)布的.NET Core應(yīng)用中包含了216個(gè)文件。我就寫一個(gè)cat命令用得著這么動(dòng)真格。。。這寫出來的命令行還有人用嗎?今天我們就來介紹一下MS的另一個(gè)開源項(xiàng)目CoreRT。用來解決這個(gè)棘手的問題。
什么是CoreRT?
CoreRT 是MS一個(gè)長(zhǎng)期開源項(xiàng)目,它早在一年前就已經(jīng)建立了,持續(xù)到今。
項(xiàng)目目標(biāo)
將.NET Core托管(CLR)應(yīng)用程序編譯為本地(特地平臺(tái))的單一可執(zhí)行文件。
說白了就是將.NET Core編譯為機(jī)器碼(也可以是其他東西,如C++代碼),而不再有之前的運(yùn)行時(shí),將.NET變?yōu)檎嬲摹办o態(tài)編譯形”語言。
基本信息
項(xiàng)目地址:https://github.com/dotnet/corert
支持的平臺(tái)
Windows x64
MacOS x64
Linux x64/ARM
CppCodeGen
WebAssembly(Blazor目前還是基于Mono的,如果CoreRT成型,不出意外會(huì)切換到CoreRT)
可以看到目前沒有支持x86,所以想跑在x86架構(gòu)的平臺(tái)上還是老老實(shí)實(shí)的吧。。
項(xiàng)目狀態(tài)
目前項(xiàng)目版本是:alpha,也就是說非正式版,切還離得比較遠(yuǎn)。
所以不推薦大家用在比較大型或商業(yè)項(xiàng)目上,會(huì)出很多問題。
但寫個(gè)小程序,小工具還是沒什么太大問題的。
Native的優(yōu)勢(shì)是什么?
Native的優(yōu)勢(shì)我一說到就激動(dòng),期待了很久。從早期Core beta2還有這個(gè)功能,到后面被擱置(來不及發(fā)布)經(jīng)歷了期望與失落。。克制住情緒,下面我們來理性分析一下Native的好處。
更少的發(fā)布文件
Native后發(fā)布文件明顯減少,一般情況下我們的.NET應(yīng)用,每引用一個(gè)packages就至少增加一個(gè)文件(*.dll)Native會(huì)將這些dll都打包在一起。這樣極大方便了發(fā)布和部署。
啟動(dòng)速度更快
我們都知道托管語言(.NET、Java)第一次執(zhí)行(不僅僅是啟動(dòng),所有的方法、語句第一次執(zhí)行都一樣)都很慢(《在.net中為什么第一次執(zhí)行會(huì)慢?》),這是托管語言的優(yōu)勢(shì)也同樣是劣勢(shì)。
Native后就不存在虛擬機(jī)技術(shù)(CLR、JVM)也就沒有的即時(shí)編譯這個(gè)動(dòng)作了。得到的好處就是第一次執(zhí)行跟第二次執(zhí)行是一樣的。
更少的內(nèi)存資源
Native后會(huì)進(jìn)一步減少內(nèi)存的使用,不需要加載一些核心“框架”(JIT)等。
Native的缺點(diǎn)?
Native并不是萬能的,也存在缺點(diǎn)。但我覺得整體上利大于弊。
更強(qiáng)的針對(duì)性
Native后就基本不能跨平臺(tái)了(這邊的跨平臺(tái)是指一次發(fā)布到處運(yùn)行,并不是指程序不能跨平臺(tái))
也就是說,如果你要運(yùn)行在windows上需要單獨(dú)為windows進(jìn)行一次發(fā)布,運(yùn)行在MacOS上也需要單獨(dú)進(jìn)行一次發(fā)布,運(yùn)行在Linux上同樣也需要單獨(dú)進(jìn)行一次發(fā)布(當(dāng)然還包括x86\x64\ARM這樣的變更,都需要重新發(fā)布)
同樣JIT也無法為代碼提供執(zhí)行編譯優(yōu)化,可以參考之前文章中,關(guān)于CPU個(gè)數(shù)的代碼優(yōu)化。
使用CoreRT發(fā)布你的第一個(gè)Native應(yīng)用程序
添加Packages
首先,因?yàn)檫@個(gè)項(xiàng)目還沒有正式發(fā)布,所以你需要添加dotnet團(tuán)隊(duì)的每日構(gòu)建nuget源,地址為:https://dotnet.myget.org/F/dotnet-core/api/v3/index.json
然后安裝packages:Microsoft.DotNet.ILCompiler
或者你可以在你的項(xiàng)目路徑下執(zhí)行下面的命令:
dotnet add package Microsoft.DotNet.ILCompiler -s?https://dotnet.myget.org/F/dotnet-core/api/v3/index.json?–v 1.0.0-alpha-*
設(shè)置RuntimeIdentifiers
RuntimeIdentifiers可設(shè)置的內(nèi)容可以參考上面的平臺(tái)支持
為對(duì)應(yīng)的平臺(tái)進(jìn)行發(fā)布
最終你的項(xiàng)目文件可以像下面這樣
執(zhí)行發(fā)布命令
dotnet publish –c Release –r win-x64
dotnet publish –c Release –r linux-x64
我們就可以去具體的發(fā)布輸出目錄看到發(fā)布結(jié)果了
可以看到大小為3.7MB還是有優(yōu)化的空間的,畢竟現(xiàn)在還不是正式版。
go引用fmt后的build大小差不多是1.9MB。
CoreRT目前存在的最大問題
CoreRT為什么不推薦大家現(xiàn)在使用?很大的一個(gè)問題就是現(xiàn)有所有用到反射的類型,都必須制定一個(gè)Mapping文件。異常麻煩。配置文件內(nèi)容大概如下:
泛型也行也得一個(gè)個(gè)完全去指定,所以不推薦大家在太復(fù)雜的應(yīng)用下使用。當(dāng)然官方最終應(yīng)該不會(huì)允許這個(gè)文件存在的。目前官方已經(jīng)開了對(duì)應(yīng)的issue用來討論如何解決這個(gè)現(xiàn)狀。
我們就再耐心等等吧。
原文:https://www.cnblogs.com/justmine/p/8630332.html
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號(hào)文章匯總 http://www.csharpkit.com
總結(jié)
以上是生活随笔為你收集整理的使用CoreRT将.NET Core发布为Native应用程序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET Core + Docke
- 下一篇: .NET Core 2.1预览版首次引入