.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 執行階段和所有應用程式相依性,因此所需的下載大小和硬碟空間會大於架構相依版本。

    提示

    您可以使用 .NET 全球化不變模式,將 Linux 系統上的部署大小減少約 28 MB。 這會強制應用程式將所有文化特性 (Culture) 視為不因文化特性而異

    提示

    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

另請參閱