本文介绍如何配置未通过 MSIX 安装的应用(即打包在外部位置或未打包),以使用引导程序 API,从而显式加载 Windows App SDK 运行时,并调用 Windows App SDK API。 未通过 MSIX 安装的应用包括被打包到外部位置的应用和未打包的应用。
重要
从 Windows App SDK 1.0 开始,从使用外部位置或未打包的应用打包Windows App SDK的默认方法是通过 project 属性(以及进行其他配置更改)使用 <WindowsPackageType>。 有关 WinUI 3 项目上下文中自动初始化所涉及的步骤,请参阅 创建您的第一个 WinUI 项目。 或者,如果现有项目不是 WinUI,请参阅 在现有项目中使用 Windows App SDK。
如果你有高级需求(例如自定义错误处理或加载特定版本的Windows App SDK),则可以改为显式调用引导程序 API。 这就是本主题演示的方法。 此外,有关详细信息,请参阅 为打包至外部位置或未打包的应用使用 Windows App SDK 运行时。
本主题演示如何从基本控制台应用project显式调用引导程序 API,但这些步骤适用于使用Windows App SDK的任何未打包的桌面应用。
在完成本教程之前,我们建议您查看运行时架构,以更多了解您的应用在使用Windows应用SDK时,它所依赖的Framework包,以及应用在以外部位置打包或未打包时所需的附加组件。
先决条件
- 用于 Windows App SDK 的安装工具。
- 确保为使用外部位置的打包应用以及未打包应用安装所有依赖项(请参阅 Windows App SDK 部署指南,了解依赖于框架的打包至外部位置或未打包的应用程序)。 运行Windows应用程序SDK运行时安装程序是一个简单的方法。
说明
可以使用 C# 或 C++ project遵循本教程。
注意
动态依赖项和引导程序 API 在由具有提升权限的进程调用时会出现故障。 因此,不应以管理员权限运行Visual Studio。 有关详细信息,请参阅 Dynamic Dependencies 不支持权限提升 #567。
按照以下说明配置 C# WinUI 项目,该项目可以打包存储在外部位置,也可以不打包。
在 Visual Studio 中,创建新的 C# Console App project。 将 project DynamicDependenciesTest 命名。 创建项目后,您应该有一个“Hello,World!”的C#控制台应用程序。
接下来,配置您的项目。
- 在 Solution Explorer 中,右键单击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 App SDK NuGet 包。
- 在 Solution Explorer 中,右键单击 Dependencies 节点,然后选择 Manage Nuget Packages。
- 在 NuGet Package Manager 窗口中,选择 Browse 选项卡,然后安装 Microsoft.WindowsAppSDK 包。
现在,您已准备好使用引导程序 API(请参阅 将 Windows 应用 SDK 运行时用于打包到外部位置的应用或未打包的应用),以动态依赖 Windows 应用 SDK 框架包。 这样,便可以在应用中使用Windows App SDK API。
打开Program.cs代码文件,并将默认代码替换为以下代码,以调用 Bootstrap.Initialize 方法来初始化引导程序。 此代码定义初始化引导程序时应用所依赖的Windows App SDK版本。
重要
需要编辑以下代码,以适应特定配置。 请参阅 Bootstrap.Initialize 方法的参数的说明,以便可以指定已安装的Windows App SDK版本之一。
using System; using Microsoft.Windows.ApplicationModel.DynamicDependency; namespace DynamicDependenciesTest { class Program { static void Main(string[] args) { Bootstrap.Initialize(0x00010002); Console.WriteLine("Hello, World!"); // Release the DDLM and clean up. Bootstrap.Shutdown(); } } }引导程序接口本质上是一个本机 C/C++ API,支持你在应用中使用 Windows App SDK 的 API。 但在使用 Windows App SDK 1.0 或更高版本的 .NET 应用中,可以使用引导程序 API 的 .NET 包装器。 该封装器提供了一种在 .NET 应用中更简便地调用引导程序 API 的方法,而不必直接调用本机 C/C++ 函数。 前面的代码示例调用了引导程序 API 的 .NET 封装器中 Bootstrap 类的静态方法 Initialize 和 Shutdown。
为了演示如何正确加载Windows App SDK运行时组件,请添加一些代码,这些代码使用 Windows App 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) 应用,请参阅 在 WPF 应用中使用Windows App SDK。