版本自适应应用

Windows SDK 的每个版本都添加了你可能想要利用的新功能。 但是,并非所有客户都同时将其设备更新到最新版本的 Windows。 你希望你的应用能够处理最广泛的设备范围,同时利用新功能(如果可用)。

按照以下三个步骤,以支持尽可能广泛的 Windows 设备:

  1. 将Visual Studio项目配置为面向最新的 API。 这会影响编译器在生成时有权访问的内容。
  2. 执行运行时检查,以确保仅调用应用运行的设备上存在的 API。
  3. 在最低版本和Windows的目标版本上测试应用。

配置Visual Studio项目

支持多个Windows版本的第一步是在Visual Studio项目中指定目标版本和最低支持的 OS/SDK 版本。

  • 目标 - Visual Studio编译应用代码的 SDK 版本。 此 SDK 版本中的所有 API 和资源在编译时可在应用代码中使用。
  • 最低 - 支持应用可以运行的最早操作系统版本的 SDK 版本。

在运行时,应用针对部署到的 OS 版本运行。 如果你使用该版本中不可用的 API,应用将引发异常。 使用运行时检查调用正确的 API,如本文后面部分所述。

Tip

Visual Studio 不会警告您关于 API 兼容性的问题。 测试并验证应用是否在所有 OS 版本(包括“最低”和“目标”)上正常工作是你的责任。

在 Visual Studio 中创建新项目时,请设置应用支持的目标和最低版本。 默认情况下,目标版本是安装的最高 SDK 版本,最低版本是安装的最低 SDK。

若要更改现有project的最低版本和目标版本,请转到 Project>Properties>应用程序>目标

执行 API 检查

版本自适应应用的关键是 API 协定和 ApiInformation 类的组合。 此类允许你检测指定的 API 协定、类型或成员是否存在,以便你可以跨各种设备和 OS 版本安全地进行 API 调用。

API 协定

设备系列中的 API 集细分为称为 API 协定的细分。 ApiInformation.IsApiContractPresent使用该方法测试是否存在 API 协定。 如果要测试许多 API,这些 API 都存在于同一版本的 API 协定中,这非常有用。

bool isScannerContractPresent =
    Windows.Foundation.Metadata.ApiInformation.IsApiContractPresent(
        "Windows.Devices.Scanners.ScannerDeviceContract", 1);

API 协定表示一项功能 - 一组相关的 API,这些 API 共同提供特定功能。 在 API 协定中实现任何 API 的平台必须实现该协定中的每个 API。 只需对该契约测试一次,即可安全地调用其任意 API。

最大且最常用的协定是Windows.Foundation.UniversalApiContract,其中包含大部分Windows 运行时 API。 有关可用合同的列表,请参阅 设备系列扩展 SDK 和 API 协定

版本适应性代码和条件式 XAML

ApiInformation在调用 API 之前,请在代码中的条件中使用类来测试是否存在 API。 方法(例如IsTypePresentIsEventPresentIsMethodPresentIsPropertyPresent允许你按所需的粒度进行测试。

有关详细信息和示例,请参阅 版本自适应代码

如果你的应用的最低版本是内部版本 17763(版本 1809)或更高版本,则可以使用 条件 XAML 在标记中设置属性并实例化对象,而无需隐藏代码。 条件 XAML 提供了一种可直接在标记中使用 ApiInformation.IsApiContractPresent 的方式。

有关详细信息和示例,请参阅 条件 XAML

测试您的版本自适应应用程序

使用版本自适应代码或条件 XAML 时,请在运行最低版本的设备以及运行Windows目标版本的设备上测试应用。

不能在单个设备上测试所有条件代码路径。 在运行最低受支持的 OS 版本的远程设备(或虚拟机)上部署和测试应用,以确保所有代码路径都正常工作。