《独立应用程序的 Windows App SDK 部署指南》

默认情况下,Windows 应用 SDK项目依赖于框架。 若要切换到自包含部署,请遵循以下步骤(Windows 应用 SDK部署概述中介绍了依赖框架和自包含的术语)。

  • 在 Visual Studio 中,右键单击应用项目节点,然后单击“编辑项目文件以打开应用项目文件进行编辑。 对于C++项目,首先单击“ 卸载项目”。
  • 在应用项目文件中的 main PropertyGroup中,添加 <WindowsAppSDKSelfContained>true</WindowsAppSDKSelfContained> 如下屏幕截图所示。

显示项目文件中设置的 WindowsAppSDKSelfContained 属性的屏幕截图。

  • 对于打包的项目,在应用项目文件中,在关闭 </Project>前的文件末尾,添加 Target 如下所示。
  <Target Name="_RemoveFrameworkReferences" BeforeTargets="_ConvertItems;_CalculateInputsForGenerateCurrentProjectAppxManifest">
    <ItemGroup>
      <FrameworkSdkReference Remove="@(FrameworkSdkReference)" Condition="$([System.String]::Copy('%(FrameworkSdkReference.SDKName)').StartsWith('Microsoft.WindowsAppRuntime.'))" />
    </ItemGroup>
  </Target>

注意

这是 Windows 应用 SDK 1.1 中 bug 的解决方法,Windows 应用 SDK 1.2 不需要这样做。 只有打包的项目才需要它。

  • 保存并关闭项目文件。
  • 单击“ 重新加载项目”。
  • 如果你使用的是 Windows 应用程序打包项目 (而不是使用空白应用、打包(桌面中的 WinUI 3)获取的单项目 MSIX ),则也会在打包项目的项目文件中进行上述所有更改。

注意

不应更改库项目。 只能在应用项目中配置自包含部署(如果适用,应在 Windows 应用程序打包项目中配置)。

有关示例应用,请参阅Windows 应用 SDK独立部署示例

将属性true设置为WindowsAppSDKSelfContained项目文件中后,Windows 应用 SDK Framework 包的内容将提取到生成输出中,并部署为应用程序的一部分。

注意

需要 将 .NET 应用发布为自包含 应用,才能完全自包含。 有关如何配置 .NET 自包含的发布配置文件,请参阅 此示例dotnet publishWindows 应用 SDK 1.1 尚不支持。

注意

C++应用也需要使用 混合 CRT ,才能完全自包含。 建议从 Directory.Build.props 导入 HybridCRT.props,以便为解决方案中的所有项目配置混合 CRT.props(请参阅 Directory.Build.props 中的示例)。 打包的应用还必须在其项目文件中设置 <UseCrtSDKReferenceStaticWarning>false</UseCrtSDKReferenceStaticWarning>有关如何使用混合 CRT 的自包含部署示例应用。

如果应用打包(有关详细信息,请参阅部署概述),则Windows 应用 SDK依赖项将作为 MSIX 包中的内容包含在内。 部署应用仍需要像注册任何其他打包的应用一样注册 MSIX 包。

如果应用打包了外部位置或解压缩,则生成输出中旁边.exe会复制Windows 应用 SDK依赖项。 可以 xcopy 部署生成的文件,或将其包含在自定义安装程序中。

附加 MSIX 包的依赖项

Windows 应用 SDK中的少量 API 依赖于表示关键操作系统(OS)功能的其他 MSIX 包。

这意味着,如果要在独立应用中使用这些 API,则可以使用以下选项:

  1. 你可以使你的功能成为可选功能,并仅在可能的情况下将其亮起。 调用 API 的 IsSupported 方法(PushNotificationManager.IsSupportedAppNotificationManager.IsSupported)可让你在运行时动态检查 API 是否可用于运行它的系统上的调用应用。
    • 这样就可以安全、有条件、有条件地使用 API,而不会影响独立部署的简单性。
    • 仅当 OS 服务安装在应用部署外部时,应用才会亮起相应的功能。 但在某些情况下,即使没有存在 Singleton 包,API 也会起作用;因此调用 IsSupported 检查通常是个好主意。
  2. 在应用安装过程中部署所需的 MSIX 包。
    • 这允许在所有方案中依赖于 API。 但是,要求将依赖项作为应用部署的一部分进行 MSIX 包部署可能会损害独立部署的简单性。
  3. 请勿使用 API。
    • 请考虑提供类似功能的替代 API,而无需其他部署要求。

选择退出(或加入)自动 UndockedRegFreeWinRT 支持

项目属性 WindowsAppSdkUndockedRegFreeWinRTInitialize 在 Windows 应用 SDK 版本 1.2 中引入(从稳定通道)。 如果该属性设置为 true,则它可确保在应用启动时自动启用Windows 应用 SDK实现无注册Windows 运行时(UndockedRegFreeWinRT)。 未打包的自包含应用需要这种支持。

WindowsAppSdkUndockedRegFreeWinRTInitialize 默认为 true(如果 WindowsAppSDKSelfContainedtrue,并且 WindowsPackageType 为 None,并且(从 Windows 应用 SDK 版本 1.2 开始)OutputType 项目属性设置为 ExeWinExe(即项目生成可执行文件)。 最后一个条件是防止在类库 DLL 和其他非可执行文件中添加自动 UndockedRegFreeWinRT 支持。 如果在非可执行文件中需要自动 UndockedRegFreeWinRT 支持(例如,由不初始化 UndockedRegFreeWinRT 的主机进程可执行文件加载的测试 DLL),则可以在<WindowsAppSdkUndockedRegFreeWinRTInitialize>true</WindowsAppSdkUndockedRegFreeWinRTInitialize>项目中显式启用它。