在 dotnet build 或 dotnet publish 期間,將建立一個與你使用的 SDK 的環境和平臺相匹配的可執行文件。 和其餘本機可執行文件同樣,可使用這些可執行文件執行相同操做,例如: web
能夠雙擊可執行文件。 json
能夠直接從命令提示符啓用應用程序,如 Windows 上的 myapp.exe,以及 Linux 和 macOS 上的 ./myapp。 併發
下面是一個基於.NET Core 2.2的項目: app
當我Build該項目以後,在bin/Debug/netcoreapp2.2目錄下有這些文件: 框架
這裏沒有.exe文件。 工具
下面是一個.NET Core 3.0的項目: 性能
當我build項目後,bin/Debug/netcoreapp3.0目錄下有這些文件: 測試
值得注意的就是,這裏有一個exe文件,點擊它能夠直接運行該項目。 ui
並且這個exe文件的大小也很小,這是由於它依賴於.NET Core運行時,它所須要的依賴項在我電腦上是全局可用的。 spa
還有另一個地方也值得注意,項目全部的依賴也都複製到了這個輸出的文件夾裏。
這種部署方式很方便,、。dotnet publish 命令支持將應用打包爲特定於平臺的單文件可執行文件。 該可執行文件是自解壓縮文件,包含運行應用所需的全部依賴項(包括本機依賴項)。 首次運行應用時,應用程序將根據應用名稱和生成標識符自解壓縮到一個目錄中。 再次運行應用程序時,啓動速度將變快。 除非使用了新版本,不然應用程序無需再次進行自解壓縮。
下面針對這個.NET Core 3.0的項目,咱們修改一下項目屬性,來實現Single-file Executables部署:
build的話不會起做用,這個功能僅支持發佈(publish):
看一下輸出文件夾:
實際上這裏只有一個exe文件,沒有其它dll文件,並且這個exe文件很大,由於這裏麪包含了它須要的全部依賴。
目前這個exe有點大,.NET core 3.0 SDK 隨附了一種工具,能夠經過分析 IL 並剪裁未使用的程序集來減少應用的大小。
自包含應用包括運行代碼所需的全部內容,而無需在主計算機上安裝 .NET。 可是,不少時候應用只須要一小部分框架便可運行,而且能夠刪除其餘未使用的庫。
.NET Core 如今包含一個設置,將使用 IL 連接器工具掃描應用的 IL。 此工具將檢測哪些代碼是必需的,而後剪裁未使用的庫。 此工具能夠顯著減小某些應用的部署大小。
要啓用此工具,請使用項目中的 <PublishTrimmed> 設置併發布自包含應用:
再次發佈後:
能夠看到exe文件的大小減少了不少,這是由於這裏只包含了這個項目真正用到的依賴。
可是啓用這個特性的時候必定要注意,若是項目使用到了反射或相關動態功能(例如 ASP.NET Core 和 WPF),那麼一般會在剪裁時損壞。 發生此損壞是由於連接器不知道此動態行爲,而且不能肯定反射須要哪些框架類型。 可配置 IL 連接器工具以發現這種狀況。
最重要的是,剪裁後務必對應用進行測試。
能夠經過將應用程序集編譯爲 ReadyToRun (R2R) 格式來改進.NET Core 應用程序的啓動時間。
R2R 是一種預先 (AOT) 編譯形式。 R2R 二進制文件經過減小應用程序加載時實時 (JIT) 編譯器須要執行的工做量來改進啓動性能。 二進制文件包含與 JIT 將生成的內容相似的本機代碼。 可是,R2R 二進制文件更大,由於它們包含中間語言 (IL) 代碼(某些狀況下仍須要此代碼)和相同代碼的本機版本。 僅當發佈面向特定運行時環境 (RID)(如 Linux x64 或 Windows x64)的自包含應用時 R2R 纔可用。
這裏首先把註釋掉<PublishTrimmed>,而後添加<PublishReadyToRun>:
發佈:
發佈後會獲得一個稍微大一點的exe文件,這是由於裏面包含了原生代碼和IL(中間語言)版的程序。