Windows 應用程式: 封裝、部署和程序

本主題將討論你的選項:

  • 你的應用程式該用哪種包裝選項(打包、帶外部位置打包,還是未打包)。
  • 你將如何部署/分發你的應用程式,以及它將如何安裝。
  • 你的應用程式執行過程,包括它的隔離程度以及可用的 API 種類。

你可以為新舊應用程式做出這些決定。 但如果你還在規劃新應用程式的階段,那麼在開始思考上述考量之前,先決定你將使用哪個開發平台和使用者介面(UI)框架。 關於這個決定,請參見 「WinUI 入門」。

封裝選項:已封裝、已封裝並具有外部位置,或未封裝

決定您的應用程式應使用哪一種封裝選項,首先取決於一個稱為 套件身分識別 的概念。 許多 Windows 擴充功能(背景任務、使用背景傳遞或 COM 啟用的推送通知情境、自訂情境選單擴充及共享目標)只有在執行時應用程式具有套件身份時才能使用,因為作業系統需要能夠識別對應 API 的呼叫者。 只有打包的應用程式(包括 帶有外部位置的應用程式)才有套件身份。

如需了解封裝模型、含外部位置的封裝模型及未封裝模型的完整說明,以及如何在這些模型之間做出選擇,請參閱封裝概觀。 關於依賴套件身份的特徵,請參見 需要套件身份的特徵。

有關如何將您的應用程式配置為封裝或非封裝的資訊:

也請參考本主題中的 Windows 封裝管理員 以及 WinGet 客戶端 章節。

部署/分發/安裝

打包後的應用程式是透過使用 MSIX 來打包和安裝的。 如果你選擇使用外部位置封裝,那就是「自備安裝程式」模式,因此安裝程式仍需由你自行處理(請參閱 透過使用外部位置封裝來授與套件身分識別)。 未封裝的應用程式根本不需要 MSIX。

封裝很重要,因為 MSIX 能讓使用者有乾淨安裝、卸載與更新體驗,支援增量式與自動更新,經過 Microsoft Store 優化,能與 Azure 虛擬桌面 的 MSIX 應用程式附加相容,且簽署後具備強大的防篡改功能。

關於部署與分發指引,請參閱 「套件與部署概述 」及 「選擇分發路徑」。 也請參見本主題中的Windows 封裝管理員與 WinGet 用戶端章節。

AppContainer 或 Medium IL

是否在 AppContainer 中執行應用程式,是安全性的問題。 AppContainer 應用程式的程序及其子程序運行於一個輕量級的應用程式容器中,只能access被明確授予的資源。 它們會使用文件系統和登錄虛擬化來隔離。 因此,在 AppContainer 中實作的應用程式因其設計,無法被駭客攻擊以執行超出既定資源限制的惡意行為。

封裝或非封裝的應用程式可以設定在 AppContainer 中執行。 但打包式應用程式的流程會比較直接。 如果一個應用程式不是 AppContainer 應用程式,那它就是 Medium IL 應用程式。

欲了解更多資訊,請參閱 AppContainer 以了解舊有應用程式 及 MSIX AppContainer 應用程式。

關於如何設定你的應用程式在 AppContainer 或 Medium IL 中執行的資訊:

  • WinUI 應用程式(Windows 應用程式 SDK)。 請參考 uap10:TrustLevel 中的 應用程式套件 manifest 屬性。
  • 桌面應用程式。 請參考 MSIX AppContainer 應用程式中的 Visual Studio project 屬性(在適合你應用程式類型的章節中)。
  • Universal Windows Platform (UWP) 應用程式。 UWP 應用程式已設定為在 AppContainer 中執行;而且這種配置是無法改變的。

請記得,未封裝的應用程式沒有應用程式套件清單。 所以對於未封裝的應用程式,你會在 project 檔案中宣告 AppContainer-or-Medium-IL 決策,而不是在 app package manifest 裡。

Win32 應用程式隔離

Win32 應用程式隔離是一項安全功能(支援 Windows 11、24H2 及更新版本),有助於在應用程式遭到入侵時防止損害,並保障使用者的隱私選擇。 它以 AppContainers 和可將資源虛擬化並提供中介存取的元件為基礎。 更多資訊請參閱 Win32 應用程式隔離概述及 Win32 應用程式隔離 GitHub 倉庫。

應用程式功能

應用程式的功能(例如網路用戶端、定位、麥克風和藍牙)主要與 在 AppContainer 中執行的封裝應用程式相關。 這包括all Universal Windows Platform(UWP)應用程式,以及某些桌面應用程式。

但有些情境甚至連中型 IL 應用程式( 也就是說,不是 AppContainer 應用程式)都應該宣告一項能力。 其中一個例子是 runFullTrust 受限能力。

關於應用程式功能、適用的應用程式類型及如何設定,請參閱應用程式能力宣告。 你可以在應用程式套件清單中設定能力;這也是為什麼它們只適用於打包式應用程式。

應用程式種類

桌面應用程式與 Universal Windows Platform (UWP) 應用程式是兩大主要類型,儘管桌面應用程式家族中也有多種應用程式類型。 選擇 UI 框架(WinForms、WPF、Win32、Direct 2D/3D 或 WinUI 3)在某種程度上與本主題所述的配置無關。

但讓我們來看看這些應用程式在包裝、部署和流程上有何不同。

首先,所有 UWP 應用程式都是打包在 AppContainer 中執行的。 但桌面應用程式則更靈活。 你可以選擇打包桌面應用程式,也可以選擇不打包。 而且,獨立於這個決定之外,你可以選擇將桌面應用程式設定為 AppContainer 或 Medium IL 應用程式。

已包裝 Unpackaged
應用程式容器 桌面應用程式
UWP 應用程式
桌面應用程式
中型 IL 桌面應用程式 桌面應用程式

對於已封裝的應用程式,要設定你想要的應用程式類型,可以在應用程式套件清單中使用 uap10:RuntimeBehavior 屬性(參見 Application (Windows 10))。

  • 桌面應用程式 是屬於 Windows 的,通常有 .exe 或 WinMain 入口點函式。 要將應用程式設定為桌面應用程式,請設定 uap10:RuntimeBehavior 為「packagedClassicApp」或「win32App」。
    • 「packagedClassicApp」這個值表示 WinUI 應用程式(Windows 應用程式 SDK)或桌面橋接應用程式(Centennial)。 差別在於百年紀念應用程式運行在 AppContainer 中。
    • 而「win32App」則指任何其他類型的 Win32 應用程式(包括包含外部定位的應用程式)。
  • 最後,設定 uap10:RuntimeBehavior 為「windowsApp」會顯示一個 UWP 應用程式。

關於所有可開發應用程式的選項,請參見 Windows app開發:選項與功能。

Windows 應用程式 SDK:依賴框架或自包含

如果你的應用程式使用 Windows 應用程式 SDK,那麼你也可以選擇如何部署應用程式所依賴的 SDK 執行環境:依賴框架(預設,目標機器必須有 Windows 應用程式 SDK 執行時和/或 Framework 套件)或自包含(你的應用程式會攜帶 Windows 應用程式 SDK 相依性)。 欲了解更多資訊,請參閱 Windows 應用程式 SDK 部署概覽。

Windows 封裝管理員 與 WinGet 用戶端

package manager 可以透過自動化工作流程,協助使用者安裝、升級或設定軟體。 套件管理器可以幫助安裝任何軟體,但通常主要用於安裝開發者工具。 所以如果你正在打造開發工具,可能會特別對這個選項感興趣。 但運作方式如下:

  • 作為軟體開發者,你會以宣告式指令的形式,向 package manager 定義成功安裝產品所需的所有要素。
  • 當使用者安裝軟體時,package manager 會依照你的宣告式指示自動化安裝與配置的工作流程。

結果是縮短了準備使用者環境的時間,並提升元件間的相容性。 你也可以用 Windows 封裝管理員 來發佈你已打包或未打包的應用程式,格式包括 .msix、.msi 和 .exe。

更多資訊請參見 Windows 封裝管理員。