.NET 應用程式發佈概觀
您使用 .NET 建立的應用程式可以透過兩種不同的模式發佈,而模式會影響使用者執行應用程式的方式。
以獨立的方式發佈應用程式會產生包含 .NET 執行階段和程式庫的應用程式,以及應用程式及其相依性。 應用程式的使用者可以在未安裝.NET 執行階段的電腦上執行該應用程式。
以架構相依的方式發佈應用程式,會產生只包含應用程式本身及其相依性的應用程式。 應用程式的使用者必須個別安裝 .NET 執行階段。
這兩種發佈模式預設會產生平台特定的可執行檔。 您可以建立架構相依的應用程式,而不需要可執行檔,而且這些是跨平台的應用程式。
產生可執行檔時,您可以使用執行階段識別碼 (RID) 指定目標平台。 如需有關 RID 的詳細資訊,請參閱 .NET RID 目錄。
下表概述用來以架構相依或獨立的方式發佈應用程式的命令:
類型 | Command |
---|---|
目前平台的架構相依可執行檔。 | dotnet publish |
特定平台的架構相依可執行檔。 | dotnet publish -r <RID> |
架構相依二進位檔。 | dotnet publish |
獨立可執行檔。 | dotnet publish -r <RID> --self-contained |
如需詳細資訊,請參閱 .NET dotnet publish 命令。
產生可執行檔
可執行檔不是跨平台,其是特定於某個作業系統和 CPU 結構。 發佈應用程式並建立可執行檔時,您可以透過獨立或架構相依的形式發佈應用程式。 以獨立的形式發佈應用程式包含具有該應用程式的 .NET 執行階段,而應用程式的使用者不需擔心在執行應用程式之前先安裝 .NET。 以架構相依的形式發佈應用程式不包含 .NET 執行階段;只會包含應用程式和協力廠商相依性。
下列命令會產生可執行檔:
類型 | Command |
---|---|
目前平台的架構相依可執行檔。 | dotnet publish |
特定平台的架構相依可執行檔。 | dotnet publish -r <RID> |
獨立可執行檔。 | dotnet publish -r <RID> --self-contained |
產生跨平台二進位檔
當您以 dll 檔案的形式,透過架構相依的形式發佈應用程式時,就會建立跨平台二進位檔。 dll 檔案會以您的專案命名。 例如,如果您有名為 word_reader 的應用程式,則會建立名為 word_reader.dll 的檔案。 以這種方式發佈的應用程式的執行是使用 dotnet <filename.dll>
命令進行,而且可以在任何平台上執行。
只要已安裝目標 .NET 執行階段,就可以在任何作業系統上執行跨平台二進位檔。 如果未安裝目標 .NET 執行階段,如果應用程式設定為向前復原,應用程式可能會使用較新的執行階段執行。 如需詳細資訊,請參閱向前復原架構相依的應用程式。
下列命令會產生跨平台二進位檔:
類型 | Command |
---|---|
架構相依的跨平台二進位檔。 | dotnet publish |
發佈架構相依
以架構相依形式發佈的應用程式是跨平台的,且不包含 .NET 執行階段。 應用程式的使用者必須安裝 .NET 執行階段。
以架構相依的形式發佈應用程式,會產生 dll 檔案形式的跨平台二進位檔,以及以您目前平台為目標的平台特定可執行檔。 dll 是跨平台的,但可執行檔不是。 例如,如果您發佈名為 word_reader 的應用程式和目標 Windows,則會建立 word_reader.exe 可執行檔以及 word_reader.dll。 以 Linux 或 macOS 為目標時,會建立 word_reader 可執行檔以及 word_reader.dll。 如果應用程式使用具有平台特定實作的 NuGet 套件,則所有平台的相依性都會複製到 publish\runtimes\{platform} 資料夾。
應用程式的跨平台二進位檔可以使用 dotnet <filename.dll>
命令執行,而且可以在任何平台上執行。
平台特定和架構相依
您可以將 -r <RID>
參數傳遞至 dotnet publish
命令,以發佈平台特定的架構相依應用程式。 這種方式的發佈與發佈架構相依相同,不同之處在於平台特定相依性的處理方式會有所不同。 如果應用程式使用具有平台特定實作的 NuGet 套件,則只會複製目標平台的相依性。 這些相依性會直接複製到 publish 資料夾。
雖然在技術上產生的二進位檔是跨平台的,但因為是以特定平台為目標,應用程式並不保證可以跨平台執行。 您可以執行 dotnet <filename.dll>
,但應用程式嘗試存取遺漏的平台特定相依性時,可能會毀損。
如需有關 RID 的詳細資訊,請參閱 .NET RID 目錄。
優點
小型部署
只散發應用程式及其相依性。 .NET 執行階段和程式庫是由使用者安裝,且所有應用程式都會共用執行階段。跨平台
應用程式和任何以 .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 執行階段和所有應用程式相依性,因此所需的下載大小和硬碟空間會大於架構相依版本。提示
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