《独立应用程序的 Windows App SDK 部署指南》
默认情况下,Windows 应用 SDK项目依赖于框架。 若要切换到自包含部署,请遵循以下步骤(Windows 应用 SDK部署概述中介绍了依赖框架和自包含的术语)。
- 在 Visual Studio 中,右键单击应用项目节点,然后单击“编辑项目文件”以打开应用项目文件进行编辑。 对于C++项目,首先单击“ 卸载项目”。
- 在应用项目文件中的 main
PropertyGroup
中,添加<WindowsAppSDKSelfContained>true</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 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 包。
如果应用打包了外部位置或解压缩,则生成输出中旁边.exe
会复制Windows 应用 SDK依赖项。 可以 xcopy 部署生成的文件,或将其包含在自定义安装程序中。
附加 MSIX 包的依赖项
Windows 应用 SDK中的少量 API 依赖于表示关键操作系统(OS)功能的其他 MSIX 包。
- 例如(从 Windows 应用 SDK 1.1 起),推送通知 API(PushNotificationManager)和应用通知 API(AppNotificationManager)依赖于单一实例包(请参阅Windows 应用 SDK的部署体系结构)。
这意味着,如果要在独立应用中使用这些 API,则可以使用以下选项:
- 你可以使你的功能成为可选功能,并仅在可能的情况下将其亮起。 调用 API 的 IsSupported 方法(PushNotificationManager.IsSupported 和 AppNotificationManager.IsSupported)可让你在运行时动态检查 API 是否可用于运行它的系统上的调用应用。
- 这样就可以安全、有条件、有条件地使用 API,而不会影响独立部署的简单性。
- 仅当 OS 服务安装在应用部署外部时,应用才会亮起相应的功能。 但在某些情况下,即使没有存在 Singleton 包,API 也会起作用;因此调用 IsSupported 检查通常是个好主意。
- 在应用安装过程中部署所需的 MSIX 包。
- 这允许在所有方案中依赖于 API。 但是,要求将依赖项作为应用部署的一部分进行 MSIX 包部署可能会损害独立部署的简单性。
- 请勿使用 API。
- 请考虑提供类似功能的替代 API,而无需其他部署要求。
选择退出(或加入)自动 UndockedRegFreeWinRT 支持
项目属性 WindowsAppSdkUndockedRegFreeWinRTInitialize 在 Windows 应用 SDK 版本 1.2 中引入(从稳定通道)。 如果该属性设置为 true,则它可确保在应用启动时自动启用Windows 应用 SDK实现无注册Windows 运行时(UndockedRegFreeWinRT)。 未打包的自包含应用需要这种支持。
WindowsAppSdkUndockedRegFreeWinRTInitialize 默认为 true(如果 WindowsAppSDKSelfContained 为 true,并且 WindowsPackageType 为 None,并且(从 Windows 应用 SDK 版本 1.2 开始)OutputType 项目属性设置为 Exe 或 WinExe(即项目生成可执行文件)。 最后一个条件是防止在类库 DLL 和其他非可执行文件中添加自动 UndockedRegFreeWinRT 支持。 如果在非可执行文件中需要自动 UndockedRegFreeWinRT 支持(例如,由不初始化 UndockedRegFreeWinRT 的主机进程可执行文件加载的测试 DLL),则可以在<WindowsAppSdkUndockedRegFreeWinRTInitialize>true</WindowsAppSdkUndockedRegFreeWinRTInitialize>
项目中显式启用它。