本主題說明您可以在 Visual Studio 專案檔中設定的專案屬性 (例如 .csproj 或 .vcxproj),以自訂應用程式的部署方式,包括設定自動初始設定式。
Windows 應用程式 SDK 中的自動初始化運算式
在 Windows 應用程式 SDK 中,有數個常式的工作是確保 Windows 應用程式執行階段已正確初始化。 這些常式稱為自動初始化程式,因為它們會在應用程式的進入點之前自動執行,並為您執行初始化工作。
小提示
如果您對技術細節感到好奇。 在 C++ 中,自動初始化器是使用靜態類別建構函式實現的。 在 C# 中,自動初始化器是使用 .NET 模組初始化器來實作的。 因此,您有時可能會聽到當正確的術語是自動初始化器時使用模組初始化器。
預設情況下,所有自動初始化設定程式都會根據應用程式的封裝和部署設定而有條件地啟用。 以下是有關它們的詳細信息:
- 引導器(也稱為動態相依性)自動初始化器。 此自動初始化器會在應用程式啟動時自動呼叫啟動載入器 API。 相依於架構的未封裝應用程式需要它,以確保 Windows 應用程式執行階段已新增至應用程式的套件圖表。 如需架構相依 (和獨立) 應用程式的相關資訊,請參閱 Windows 應用程式 SDK 部署概觀。 如需未封裝 (和已封裝) 應用程式的相關資訊,請參閱 Windows 應用程式:封裝、部署和程式。
- 針對已封裝的應用程式,您不需要啟動載入器/動態相依性自動初始化運算式,因為檔案
appxmanifest.xml會表示架構相依性。 對於獨立的應用程式,您不需要啟動載入器/動態相依性自動初始化器,因為這些應用程式不使用架構。 - 您可以透過
.csproj選擇退出 或.vcxproj檔案中的<WindowsAppSdkBootstrapInitialize>false</WindowsAppSdkBootstrapInitialize>引導程式/動態相依性自動初始化器。
- 針對已封裝的應用程式,您不需要啟動載入器/動態相依性自動初始化運算式,因為檔案
- 部署管理員自動初始化程式。 對於使用主要/單一功能 (例如推播通知) 的架構相依封裝應用程式,這是必要的,因為檔案
appxmanifest.xml無法表示這些相依性。- 針對獨立的應用程式,您不需要部署管理員自動初始化運算式,因為這些應用程式不支援主要/單一功能。
- 如需更多重要資訊,請參閱本主題稍後的 部署管理員自動初始化程式 一節。
- 免註冊啟動自動初始化器。 如果應用程式在 Windows 10 May 2019 Update (版本 1903;代號為 “19H1”) 之前的作業系統版本上向下執行,則獨立應用程式必須使用資訊清單型未停駐的免註冊 Windows 執行階段 (WinRT) 啟用 (UndockedRegFreeWinRT) 。
- 針對架構相依的應用程式,以及以 Windows 10 版本 1903 或更新版本為目標的獨立應用程式,您不需要免註冊啟用自動初始化運算式。 這些應用程式可以透過 選擇退出
<WindowsAppSdkUndockedRegFreeWinRTInitialize>false</WindowsAppSdkUndockedRegFreeWinRTInitialize>。
- 針對架構相依的應用程式,以及以 Windows 10 版本 1903 或更新版本為目標的獨立應用程式,您不需要免註冊啟用自動初始化運算式。 這些應用程式可以透過 選擇退出
- 相容性自動初始化器。 這是應用程式使用 A/B 內含功能來控制服務發行行為的必要條件。 如需詳細資訊,請參閱 RuntimeCompatibilityOptions。
- 對於不使用 A/B 包含 (這是預設值) 的應用程式,您不需要相容性自動初始化運算式。
部署管理員自動初始化程式
當使用 Windows 應用程式 SDK 1.8 或更新版本的應用程式啟動時,部署管理員自動初始化器預設會執行。 但你可以選擇不發生這種情況。 本節說明允許部署管理員自動初始化運算程式執行的好處和注意事項,並協助您決定是否選擇退出。
若要讓您的應用程式使用主要/單一套件中的功能 (例如推播通知):1. 您必須使用部署 API 來確保已部署這些套件 (因為主要/單一套件不是架構,而是「主要」套件,例如應用程式;因此無法在應用程式的 appx 資訊清單中註冊為相依性。相反地,部署 API 提供部署這些套件的功能)。 2. 由於 1) 您的應用程式需要呼叫 DeploymentManager.Initialize 來初始化部署管理員。 您的應用程式可以自動或明確地執行此操作,如我們將看到的。 3. 您的應用程式必須是依賴框架的封裝應用程式,以便依賴主要/單例套件。
初始化部署管理員的其中一種方式是允許部署管理員自動初始化程式執行 (請參閱本主題稍早的 Windows 應用程式 SDK 中的自動初始化程式 一節)。 部署管理員自動初始化運算式會為您呼叫 DeploymentManager.Initialize 。 初始化部署管理員的另一種方式是明確呼叫 DeploymentManager.Initialize 自己。
如果您的應用程式 (使用 Windows 應用程式 SDK 1.8 或更新版本) 不需要主要/單一套件,則您應該在應用程式的專案檔中將 WindowsAppSdkDeploymentManagerInitialize 屬性設定為 false ,以選擇退出部署管理員自動初始化運算式。
如果您的應用程式(使用 Windows 應用程式 SDK 1.8 或更新版本)確實需要主要/單一封裝,則您可以:
- 允許部署管理員的自動初始化器運行(預設會自動運行),
- 或在應用程式的專案檔中將 WindowsAppSdkDeploymentManagerInitialize 屬性設定為 false ,以選擇退出部署管理員自動初始化運算式。 然後,您應該顯式地呼叫DeploymentManager.Initialize。
這很重要
對於在 AppContainer 中執行的任何進程,如果您導致呼叫 DeploymentManager.Initialize,則您的應用程式必須在packageManagement中宣告受限制的功能。
項目屬性
下表是您可以在應用程式專案檔中設定的屬性。 如需 Windows 應用程式 SDK 中自動初始設定式的詳細資訊,請參閱上一節 (上述) 。
| 屬性名稱和描述 | 價值觀 | 更多資訊 |
|---|---|---|
| AppxPackage。 指定是否封裝 WinUI 3 應用程式。 | false (針對未封裝的應用程式) 或 absent (針對已封裝的應用程式) | 解壓縮一個 WinUI 應用程式 |
| EnableMsixTooling。 啟用專案的單一專案 MSIX 功能。 | true (啟用) 或 absent (停用) | 使用單一專案 MSIX 封裝您的應用程式 |
| 使用WinUI。 指定您是否在應用程式中使用 WinUI 3 使用者介面架構。 | true 或不存在 ( 對於 false) | Windows 應用程式 SDK 中的 WinUI (WinUI 3) |
| WindowsAppSdkBootstrapInitialize 的 Initialize 。 判斷 Windows 應用程式 SDK 是否利用啟動載入器/動態相依性自動初始化運算式。 | true (可執行檔的預設值)、 false (非可執行檔的預設值) | 選擇退出 (或加入) 自動初始化運算式 |
| WindowsAppSdkDeploymentManagerInitialize 。 判斷 Windows App SDK 是否使用部署管理員自動初始化器。 | true (預設值)、 false | |
| WindowsAppSDKRuntimePatchLevel1、 WindowsAppSDKRuntimePatchLevel2 和 WindowsAppSDKDisabledChanges。 判斷 Windows 應用程式 SDK 是否利用相容性自動初始化運算式,並針對服務更新中新增之變更的 Windows 應用程式執行階段行為設定任何所需的相容性選項。 | 各種或不存在(停用自動初始化器) | RuntimeCompatibilityOptions |
| WindowsAppSdkSelfContained。 判斷應用程式是否以 獨立方式部署。 | true 或不存在 ( 對於 false) | 獨立應用程式的 Windows 應用程式 SDK 部署指南 |
| WindowsAppSdkUndockedRegFreeWinRTInitialize. 判斷 Windows 應用程式 SDK 是否利用免註冊啟用自動初始化運算式。 | true (可執行檔的預設值)、 false (非可執行檔的預設值) | 選擇退出 (或加入) 自動 UndockedRegFreeWinRT 支援 |
WindowsPackageType 的 PackageType 中。
<WindowsPackageType>None</WindowsPackageType>設定未封裝的應用程式會導致啟動載入器/動態相依性自動初始化運算程式尋找並載入最適合您應用程式的 Windows 應用程式 SDK 版本。 |
None 或 absent (停用自動初始化運算式) |
解壓縮一個 WinUI 應用程式 幕後,以及選擇退出自動初始化器 |
Example
以下是 C# WinUI 3 專案典型檔案的 .csproj 摘錄,顯示上表中的一些專案屬性正在使用中。
...
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows10.0.19041.0</TargetFramework>
<TargetPlatformMinVersion>10.0.17763.0</TargetPlatformMinVersion>
...
<UseWinUI>true</UseWinUI>
<EnableMsixTooling>true</EnableMsixTooling>
</PropertyGroup>
...