本文介绍如何将未采用 MSIX 安装的应用(也就是说,已使用外部位置打包或未打包)配置为使用启动程序 API,使其显式加载 Windows 应用 SDK 运行时,并调用 Windows 应用 SDK API。 未通过 MSIX 安装的应用包括被打包到外部位置的应用和未打包的应用。
重要
从 Windows 应用 SDK 1.0 开始,从使用外部位置打包或未打包的应用加载 Windows 应用 SDK 的默认方法是通过 <WindowsPackageType> 项目属性使用自动初始化(以及进行其他配置更改)。 有关 WinUI 3 项目上下文中自动初始化所涉及的步骤,请参阅 “创建并运行 WinUI 3 项目”。 或者,如果现有项目不是 WinUI,请参阅 在现有项目中使用 Windows 应用 SDK。
如果你有高级需求(例如自定义错误处理或加载特定版本的Windows 应用 SDK),则可以改为显式调用引导程序 API。 这就是本主题演示的方法。 另请参阅将 Windows 应用 SDK 运行时用于使用外部位置打包的应用或未打包的应用,了解更多信息。
本主题演示如何从基本控制台应用project显式调用引导程序 API,但这些步骤适用于使用Windows 应用 SDK的任何未打包的桌面应用。
在完成本教程之前,我们建议您查看运行时架构,以更多了解您的应用在使用Windows应用SDK时,它所依赖的Framework包,以及应用在以外部位置打包或未打包时所需的附加组件。
先决条件
- 用于 Windows 应用 SDK 的安装工具。
- 确保为使用外部位置打包的应用以及未打包的应用安装所有依赖项(请参阅 Windows 应用 SDK 部署指南,了解使用外部位置打包或未打包的依赖于框架的应用)。 运行Windows应用程序SDK运行时安装程序是一个简单的方法。
说明
可以使用 C# 或 C++ project遵循本教程。
注意
动态依赖项和引导程序 API 在由具有提升权限的进程调用时会出现故障。 因此,Visual Studio 在发布时不应提升。 请参阅动态依赖项不支持提升 #567,了解更多详细信息。
按照以下说明配置 C# WinUI 项目,该项目可以打包存储在外部位置,也可以不打包。
在 Visual Studio 中,创建新的 C# Console App project。 将 project DynamicDependenciesTest 命名。 创建项目后,您应该有一个“Hello,World!”的C#控制台应用程序。
接下来,配置您的项目。
- 在 解决方案资源管理器 中,右键单击project并选择 Edit Project File。
- 将 TargetFramework 元素的值替换为目标框架标识符。 例如,如果你的应用面向版本 2004 Windows 10,请使用以下内容。
<TargetFramework>net8.0-windows10.0.19041.0</TargetFramework>- 保存并关闭项目文件。
将解决方案的平台更改为 x64。 .NET project中的默认值为 AnyCPU,但 WinUI 不支持该平台。
- 选择 Build>Configuration Manager。
- 选择“活动解决方案平台”下的下拉列表,单击“新建”选项以打开“新建解决方案平台”对话框。
- 在“键入或选择新平台”下的下拉菜单中,选择“x64”。
- 选择“确定”以关闭“新建解决方案平台”对话框。
- 在 Configuration Manager 中,单击 Close。
在project中安装 Windows 应用 SDK NuGet 包。
- 在 解决方案资源管理器 中,右键单击 Dependencies 节点,然后选择 Manage Nuget Packages。
- 在 NuGet 程序包管理器 窗口中,选择 Browse 选项卡,然后安装 Microsoft.WindowsAppSDK 包。
现在,你便可使用启动程序 API(请参阅将 Windows 应用 SDK 运行时用于使用外部位置打包的应用或未打包的应用)来动态获取针对 Windows 应用 SDK 框架包的依赖项。 这样,便可以在应用中使用Windows 应用 SDK API。
打开Program.cs代码文件,并将默认代码替换为以下代码,以调用 Bootstrap.Initialize 方法来初始化引导程序。 此代码定义初始化引导程序时应用所依赖的Windows 应用 SDK版本。
重要
需要编辑以下代码,以适应特定配置。 请参阅 Bootstrap.Initialize 方法的参数的说明,以便可以指定已安装的Windows 应用 SDK版本之一。
using System; using Microsoft.Windows.ApplicationModel.DynamicDependency; namespace DynamicDependenciesTest { class Program { static void Main(string[] args) { Bootstrap.Initialize(0x00010005); Console.WriteLine("Hello, World!"); // Release the DDLM and clean up. Bootstrap.Shutdown(); } } }注意
传递给
Bootstrap.Initialize的十六进制值编码了你的应用所针对的 Windows 应用 SDK 运行时的主版本和次版本。0x00010005表示版本 1.5。 更新此值以匹配项目引用Windows 应用 SDK版本(例如,0x00010006对于版本 1.6)。引导程序接口本质上是一个本机 C/C++ API,支持你在应用中使用 Windows 应用 SDK 的 API。 但在使用 Windows 应用 SDK 1.0 或更高版本的 .NET 应用中,可以使用引导程序 API 的 .NET 包装器。 该封装器提供了一种在 .NET 应用中更简便地调用引导程序 API 的方法,而不必直接调用本机 C/C++ 函数。 前面的代码示例调用了引导程序 API 的 .NET 封装器中 Bootstrap 类的静态方法 Initialize 和 Shutdown。
为了演示如何正确加载Windows 应用 SDK运行时组件,请添加一些代码,这些代码使用 Windows 应用 SDK 中的 ResourceManager 类来加载字符串资源。
将新的 资源文件(.resw)添加到项目中(保留默认名称)。
在编辑器中打开资源文件后,使用以下属性创建新的字符串资源。
- 名称:消息
- 值:Hello, resources!
保存资源文件。
打开 Program.cs 代码文件,并将行
Console.WriteLine("Hello, World!");替换为以下代码。
// Create a resource manager using the resource index generated during build. var manager = new Microsoft.Windows.ApplicationModel.Resources.ResourceManager("DynamicDependenciesTest.pri"); // Look up a string in the .resw file using its name. Console.WriteLine(manager.MainResourceMap.GetValue("Resources/Message").ValueAsString);- 单击“启动而不调试”(或“开始调试”)生成并运行你的应用。 应会看到字符串
Hello, resources!已成功显示。
如果你的项目为WPF
有关Windows Presentation Foundation(WPF)应用,请参阅 使用现有项目中的Windows 应用 SDK。