Default Executables?默認可執(zhí)行文件?
在?dotnet build?或?dotnet publish?期間,將創(chuàng)建一個與你使用的?SDK?的環(huán)境和平臺相匹配的可執(zhí)行文件。?
和其他本機可執(zhí)行文件一樣,可以使用這些可執(zhí)行文件執(zhí)行相同操作,例如:??
*
可以雙擊可執(zhí)行文件。??
*
可以直接從命令提示符啟用應用程序,如?Windows?上的?myapp.exe,以及?Linux?和?macOS?上的?./myapp。?
?
下面是一個基于.NET Core 2.2的項目:?
?
當我Build該項目之后,在bin/Debug/netcoreapp2.2目錄下有這些文件:?
這里沒有.exe文件。?
?
下面是一個.NET Core 3.0的項目:?
?
當我build項目后,bin/Debug/netcoreapp3.0目錄下有這些文件:?
值得注意的就是,這里有一個exe文件,點擊它可以直接運行該項目。?
而且這個exe文件的大小也很小,這是因為它依賴于.NET Core運行時,它所需要的依賴項在我電腦上是全局可用的。?
還有另外一個地方也值得注意,項目所有的依賴也都復制到了這個輸出的文件夾里。?
?
Single-file Executables?單文件可執(zhí)行文件?
這種部署方式很方便,、。dotnet publish?命令支持將應用打包為特定于平臺的單文件可執(zhí)行文件。?
該可執(zhí)行文件是自解壓縮文件,包含運行應用所需的所有依賴項(包括本機依賴項)。?首次運行應用時,應用程序?qū)⒏鶕?jù)應用名稱和生成標識符自解壓縮到一個目錄中。?
再次運行應用程序時,啟動速度將變快。?除非使用了新版本,否則應用程序無需再次進行自解壓縮。?
?
下面針對這個.NET Core 3.0的項目,我們修改一下項目屬性,來實現(xiàn)Single-file Executables部署:?
?
build的話不會起作用,這個功能僅支持發(fā)布(publish):?
?
看一下輸出文件夾:?
實際上這里只有一個exe文件,沒有其它dll文件,而且這個exe文件很大,因為這里面包含了它需要的所有依賴。?
?
Assembly linking?程序集鏈接
目前這個exe有點大,.NET core 3.0 SDK?隨附了一種工具,可以通過分析?IL?并剪裁未使用的程序集來減小應用的大小。?
自包含應用包括運行代碼所需的所有內(nèi)容,而無需在主計算機上安裝?.NET。?但是,很多時候應用只需要一小部分框架即可運行,并且可以刪除其他未使用的庫。?
?.NET Core?現(xiàn)在包含一個設置,將使用?IL?鏈接器工具掃描應用的?IL。?此工具將檢測哪些代碼是必需的,然后剪裁未使用的庫。?
此工具可以顯著減少某些應用的部署大小。?
?
要啟用此工具,請使用項目中的?<PublishTrimmed>?設置并發(fā)布自包含應用:?
?
再次發(fā)布后:?
可以看到exe文件的大小減小了很多,這是因為這里只包含了這個項目真正用到的依賴。?
?
但是啟用這個特性的時候一定要注意,如果項目使用到了反射或相關動態(tài)功能(例如?ASP.NET Core?和?WPF),那么通常會在剪裁時損壞。?
發(fā)生此損壞是因為鏈接器不知道此動態(tài)行為,并且不能確定反射需要哪些框架類型。?可配置?IL?鏈接器工具以發(fā)現(xiàn)這種情況。??
最重要的是,剪裁后務必對應用進行測試。?
?
ReadyToRun?鏡像?
可以通過將應用程序集編譯為?ReadyToRun (R2R)?格式來改進.NET Core?應用程序的啟動時間。?
R2R?是一種預先?(AOT)?編譯形式。?R2R?二進制文件通過減少應用程序加載時實時?(JIT)?編譯器需要執(zhí)行的工作量來改進啟動性能。?二進制文件包含與
?JIT?將生成的內(nèi)容類似的本機代碼。?但是,R2R?二進制文件更大,因為它們包含中間語言?(IL)?代碼(某些情況下仍需要此代碼)和相同代碼的本機版本。?
僅當發(fā)布面向特定運行時環(huán)境?(RID)(如?Linux x64?或?Windows x64)的自包含應用時?R2R?才可用。?
?
這里首先把注釋掉<PublishTrimmed>,然后添加<PublishReadyToRun>:?
?
發(fā)布:?
發(fā)布后會得到一個稍微大一點的exe文件,這是因為里面包含了原生代碼和IL(中間語言)版的程序。?
熱門工具 換一換