适用于独立应用的 Windows 应用 SDK 部署指南

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

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

Screenshot showing the WindowsAppSDKSelfContained property set in a project file.

  • 对于打包的项目,在应用项目文件中,在关闭 </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 框架包的内容将提取到生成输出中,并部署为应用程序的一部分。

注意

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

注意

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

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

如果你的应用打包了外部位置或解压缩,则 Windows 应用 SDK 依赖项将复制到生成输出中的旁边 .exe 。 可以 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如果 WindowsAppSDKSelfContainedtrue,并且 WindowsPackageTypeNone,并且(从 Windows App SDK 版本 1.2 开始)OutputType 项目属性设置为 ExeWinExe(即项目生成可执行文件)。 最后一个条件是防止在类库 DLL 和其他非可执行文件中添加自动 UndockedRegFreeWinRT 支持。 如果在非可执行文件中需要自动 UndockedRegFreeWinRT 支持(例如,由不初始化 UndockedRegFreeWinRT 的主机进程可执行文件加载的测试 DLL),则可以在<WindowsAppSdkUndockedRegFreeWinRTInitialize>true</WindowsAppSdkUndockedRegFreeWinRTInitialize>项目中显式启用它。