.NET 應用程式發佈概觀
您使用 .NET 建立的應用程式可以以兩種不同的模式發佈,而模式會影響使用者如何執行您的應用程式。
將您的應用程式發佈為 獨立式,會產生一個包含 .NET 執行階段和函式庫的應用程式,以及您的應用程式及其相依項目。 應用程式的使用者可以在未安裝 .NET 運行時間的計算機上執行它。
將應用程式發佈為 架構相依 會產生一個僅包含應用程式本身及其相依性的應用程式。 應用程式的用戶必須個別安裝 .NET 執行階段。
這兩種發佈模式預設會產生平臺特定的可執行檔。 不需要可執行檔即可建立架構相依應用程式,而且這些應用程式是跨平臺的應用程式。
產生可執行檔時,您可以使用運行時間識別碼 (RID) 來指定目標平臺。 如需 RID 的詳細資訊,請參閱 .NET RID 目錄。
下表概述用來將應用程式發佈為架構相依或獨立式的命令:
類型 | 命令 |
---|---|
目前平台的架構相依可執行檔。 | dotnet publish |
依賴架構的可執行檔 用於特定平台。 | dotnet publish -r <RID> |
架構相依的二進位。 | dotnet publish |
獨立式可執行檔案。 | dotnet publish -r <RID> --self-contained |
如需詳細資訊,請參閱 .NET dotnet publish 命令。
產生可執行檔
可執行檔不是跨平臺,它們專屬於操作系統和CPU架構。 發布應用程式並建立可執行檔案時,您可以將應用程式發佈為 獨立式 或 架構相依。 將應用程式發布為自包含會將 .NET 執行階段與應用程式一起包含,這樣應用程式的使用者可以不必擔心在執行前安裝 .NET。 將應用程式發佈為架構依賴,不包含 .NET 執行階段,只包含應用程式和第三方相依性。
下列命令會產生可執行檔案:
類型 | 命令 |
---|---|
架構相依的可執行檔,適用於目前的平台。 | dotnet publish |
特定平台的架構相依可執行檔。 | dotnet publish -r <RID> |
獨立式可執行檔案。 | dotnet publish -r <RID> --self-contained |
產生跨平臺二進位檔
當您以 dll 檔案的形式,將應用程式發佈為 架構相依時,就會建立跨平臺二進位檔。
dll 檔案的命名是以專案為名。 例如,如果您有名為 word_reader的應用程式,則會建立名為 word_reader.dll 的檔案。 以這種方式發佈的應用程式會使用 dotnet <filename.dll>
命令執行,而且可以在任何平台上執行。
只要已安裝目標 .NET 執行環境,跨平台二進位檔即可在任何操作系統上執行。 如果未安裝目標 .NET 執行階段,且應用程式設定為向前滾動,應用程式可能會使用較新的執行階段運行。 如需詳細資訊,請參閱 架構相依應用程式向前更新。
您可以選擇透過 dotnet
命令,以平臺特定可執行檔或跨平臺二進位檔的形式執行應用程式。 針對透過平臺特定可執行文件啟動的一般伺服器應用程式,啟動平臺特定可執行檔與 dotnet
命令時,應該不會有任何應用程式行為差異,這可讓您更妥善地與基礎操作系統整合。 例如:
- 您會在進程清單中看到應用程式可執行檔名稱,而不是
dotnet
,如果有多個,可能會造成混淆。 - 您可以使用作業系統特定功能來自訂平台特定的可執行檔。 例如,請參閱 關於在 Windows上設定預設堆疊大小的討論。
下列命令會產生跨平臺二進位檔:
類型 | 命令 |
---|---|
架構相依的跨平臺二進位。 | dotnet publish |
發佈依賴框架的應用程式
發佈為架構相依的應用程式是跨平台的,且不包含 .NET 執行階段。 應用程式的用戶必須安裝 .NET 執行階段。
將應用程式發佈為架構相依,會產生 跨平臺二進位 做為 dll 檔案,以及以您目前平臺為目標的 平臺特定 可執行檔。 dll 是跨平臺,而可執行檔則不是。 例如,如果您發佈名為 word_reader 並以 Windows 為目標的應用程式,則會建立 word_reader.exe 可執行檔以及 word_reader.dll。 以 Linux 或 macOS 為目標時,會建立 word_reader 可執行檔案以及 word_reader.dll。 如果應用程式使用特定於平臺的實作的 NuGet 套件,則所有平臺的相依性都會複製到 發佈的\runtimes\{platform} 資料夾。
應用程式的跨平臺二進位檔可以使用 dotnet <filename.dll>
命令執行,而且可以在任何平台上執行。
平臺特定和架構相依
您可以將 -r <RID>
參數傳遞至 dotnet publish
命令,以發佈平臺專屬的架構相關應用程式。 以這種方式發佈與 發佈依賴架構相同,不同之處在於平台特定的依賴會以不同的方式處理。 如果應用程式使用具有平臺特定實作的 NuGet 套件,則只會複製目標平臺的相依性。 這些相依性會直接複製到 發布 資料夾。
雖然從技術上來說,產生的二進位檔是跨平臺,但藉由以特定平臺為目標,您的應用程式不保證會執行跨平臺。 您可以執行 dotnet <filename.dll>
,但應用程式嘗試存取遺漏的平臺特定相依性時,可能會當機。
如需 RID 的詳細資訊,請參閱 .NET RID 目錄。
優勢
小型部署
只有您的應用程式及其相依性會被發佈。 .NET 運行時間和連結庫是由使用者安裝,且所有應用程式都會共用運行時間。跨平臺
您的應用程式和任何基於 .NET 的函式庫都可以在其他作業系統上運行。 您不需要為應用程式定義目標平臺。 如需 .NET 檔案格式的相關信息,請參閱 .NET 元件檔案格式。使用最新修補的運行時
應用程式會使用安裝在目標系統上的最新執行階段(在目標的 .NET 主次版本系列內)。 這表示您的應用程式會自動使用最新修補的 .NET 運行時間版本。 您可以覆寫此預設行為。 如需詳細資訊,請參閱 架構相依應用程式向前更新。
缺點
需要預先安裝執行階段
只有當應用程式目標版本已安裝在主機系統上時,您的應用程式才能執行。 您可以將應用程式的逐步更新行為設定為需要特定版本的 .NET,或允許較新版本的 .NET。 如需詳細資訊,請參閱 依賴框架的應用程式前進。.NET 可能會變更
您可以在執行應用程式的電腦上更新 .NET 執行時間和連結庫。 在罕見的情況下,如果您使用 .NET 程式庫,大多數應用程式會這樣做,這可能會改變您的應用程式的行為。 您可以設定應用程式如何使用較新版本的 .NET。 如需詳細資訊,請參閱 架構相依應用程式向前移動。
例子
將應用程式發佈為跨平臺並依賴特定框架。 系統會建立以您目前平臺為目標的可執行檔,以及 dll 檔案。 任何平臺特定的相依性會隨應用程式一起發佈。
dotnet publish
將應用程式發佈為特定平台且依賴框架。 Linux 64 位可執行檔會與 dll 檔案一起建立。 只有目標平臺的依賴項會與應用程式一起發佈。
dotnet publish -r linux-x64
發佈獨立式
將您的應用程式發佈為獨立式會產生平臺特定的可執行檔。 輸出發佈資料夾包含應用程式的所有元件,包括 .NET 連結庫和目標運行時間。 應用程式與其他 .NET 應用程式隔離,且不會使用本機安裝的共用運行時間。 您應用程式的使用者不需要下載並安裝 .NET。
您可以將 --self-contained
參數傳遞至 dotnet publish
命令,以發佈獨立應用程式。 可執行檔二進位檔會針對指定的目標平台產生。 例如,如果您有名為 word_reader的應用程式,而且發行適用於 Windows 的獨立可執行檔,則會建立 word_reader.exe 檔案。 在 Linux 或 macOS 上進行發行時,將會建立 word_reader 檔案。 目標平臺和架構是使用 dotnet publish
命令的 -r <RID>
參數來指定。 如需 RID 的詳細資訊,請參閱 .NET RID 目錄。
如果應用程式具有平臺特定的相依性,例如包含平臺特定相依性的 NuGet 套件,這些相依性會連同應用程式一起複製到發佈資料夾。
優勢
控制 .NET 版本
您可以控制使用您的應用程式部署的 .NET 版本。平臺特定目標
因為您必須為每個平台發佈您的應用程式,因此您知道應用程式執行的位置。 如果 .NET 引進新的平臺,使用者就無法在該平台上執行您的應用程式,直到您發行以該平臺為目標的版本。 您可以在使用者在新平台上執行您的應用程式之前,先測試應用程式是否有相容性問題。
缺點
較大的部署
因為您的應用程式包含 .NET 運行時間和所有應用程式相依性,因此所需的下載大小和硬碟空間大於 架構相依 版本。提示
您可以使用 .NET 全球化不變模式,使 Linux 系統上部署的大小減少約 28 MB,。 這會強制您的應用程式將所有文化特性視為不變文化特性。
提示
IL 修剪 可以進一步減少您的部署的體積。
更難更新 .NET 版本
.NET 執行環境(隨您的應用程式一起散發)只能透過發佈新版的應用程式來升級。
例子
發佈完整打包的應用程式。 已建立 macOS 64 位元的可執行檔。
dotnet publish -r osx-x64 --self-contained
發佈自包含的應用程式。 建立 Windows 64 位可執行檔。
dotnet publish -r win-x64 --self-contained
使用 ReadyToRun 映像發佈
使用 ReadyToRun 映像發佈可改善應用程式的啟動時間,代價是增加應用程式的大小。 如需詳細資訊,請參閱 ReadyToRun。
優勢
-
改善啟動時間
應用程式花費較少的時間執行 JIT。
缺點
-
較大的大小
應用程式佔用較多的磁碟空間。
例子
發佈應用程式獨立式和 ReadyToRun。 已建立 macOS 64 位元可執行檔。
dotnet publish -c Release -r osx-x64 --self-contained -p:PublishReadyToRun=true
發佈一個自包含且 ReadyToRun 的應用程式。 建立 Windows 64 位可執行檔。
dotnet publish -c Release -r win-x64 --self-contained -p:PublishReadyToRun=true