排查将 Windows 运行时 8.x 移植到 UWP 的问题

上一主题是 移植项目

我们强烈建议阅读到此移植指南的末尾,但是我们也理解你希望尽快前进到项目生成和运行的阶段。 阅读到该末尾后,你可以注释或排除非必要的代码,然后稍后返回支付该债务,从而临时加快进度。 本主题中的疑难解答症状和补救办法的表格可能在此阶段对你有用,尽管它无法替代阅读接下来的一些主题。 在你执行到以后的主题时,你可以一直重新参考该表。

跟踪问题

XAML 分析异常可能很难诊断,尤其是在异常中没有有意义的错误消息时。 请确保已将调试程序配置为捕获第一轮异常(以便试图捕获早期的分析异常)。 你可以检查调试程序中的异常变量,以确定 HRESULT 或消息中是否具有任何有用的信息。 也可以检查 Visual Studio 的输出窗口,以获取由 XAML 分析器输出的错误消息。

如果你的应用终止并且你所知的是,在 XAML 标记分析期间引发了未经处理的异常,那么这可能是对缺失资源的引用的结果(即,通用 8.1 应用存在其键但不适用于 Windows 10 应用(例如某些系统 TextBlock 样式键)的资源)。 也可能是 UserControl、自定义控件或自定义布局面板内引发的异常。

最后一项措施是进行二进制拆分。 从页面中删除大约一半的标记,然后重新运行应用。 然后,你将知道错误是否位于你删除的一半(现在应该还原)或你未删除的一半中。 通过拆分包含错误的那一半来重复此过程,依此类推,直到完全解决了问题。

TargetPlatformVersion

本部分介绍如何在 Visual Studio 中打开 Windows 10 项目时看到消息“需要 Visual Studio 更新”。 一个或多个项目需要未安装或包含在 Visual Studio 的未来更新过程中的平台 SDK <版本> 。

  • 首先,确定已安装的适用于 Windows 10 的 SDK 的版本号。 导航到 C:\Program Files (x86)\Windows Kits\10\Include\<versionfoldername>,并记下 <versionfoldername>,格式为四部分表示法“Major.Minor.Build.Revision”
  • 打开项目文件进行编辑并查找 TargetPlatformVersionTargetPlatformMinVersion 元素。 编辑它们以如下所示,将 <versionfoldername> 替换为磁盘上找到的象限表示法版本号:
   <TargetPlatformVersion><versionfoldername></TargetPlatformVersion>
    <TargetPlatformMinVersion><versionfoldername></TargetPlatformMinVersion>

排查症状和补救措施

表中的补救措施信息旨在为你提供足够的信息来解除阻止自己。 阅读后续主题时,你将找到有关这些问题的更多详细信息。

症状 纠正方法
在 Visual Studio 中打开 Windows 10 项目时,会看到消息“需要 Visual Studio 更新。 一个或多个项目需要未安装或包含在 Visual Studio 的未来更新过程中的平台 SDK <版本> 。 请参阅本主题中的 TargetPlatformVersion 部分。
在xaml.cs文件中调用 InitializeComponent 时,将引发 System.InvalidCastException。 如果有多个 xaml 文件(至少其中一个是 MRT 限定)共享同一个xaml.cs文件和元素具有两个 xaml 文件之间不一致的 x:Name 属性,则可能会发生这种情况。 尝试将相同的名称添加到两个 xaml 文件中的相同元素,或完全省略名称。
当在设备上运行的应用终止,或从 Visual Studio 中启动时,你将看到错误“无法激活 Windows 运行时 8.x 应用 […]。 激活请求失败,出现错误“Windows 无法与目标应用程序通信。 这通常表示目标应用程序的进程已中止。 […]”. 问题可能是初始化期间在自己的 Pages 或绑定属性(或其他类型)中运行的命令性代码。 或者,在分析即将在应用终止时显示的 XAML 文件(如果从 Visual Studio 启动,这将是启动页面)时可能发生此情况。 查找无效的资源密钥,并/或尝试本主题的“跟踪问题”部分中的一些指南。
XAML 分析程序或编译器或运行时异常提供错误“无法解析资源”<resourcekey>”。 资源密钥不适用于通用 Windows 平台(UWP)应用(例如,某些Windows Phone资源的情况)。 找到正确的等效资源并更新标记。 你可能会立即遇到的示例是系统键,例如 PhoneAccentBrush
C# 编译器提供错误“找不到类型或命名空间名称'name>'<”或“命名空间名称'<name>'不存在于命名空间中 ”“或”类型或命名空间名称 '<name>' 不存在于当前上下文中”。 这可能意味着类型是在扩展 SDK 中实现的(尽管在某些情况下,补救措施不太简单)。 使用 Windows API 引用内容确定用于实现 API 的扩展 SDK,然后通过使用 Visual Studio 的“Add”>“Reference”命令,将对该 SDK 的引用添加到项目。 如果应用面向称为通用设备系列的 API 集,则必须在运行时使用 ApiInformation 类在运行时测试扩展 SDK 是否存在(这称为自适应代码)。 如果存在通用 API,则这始终优于扩展 SDK 中的 API。 有关详细信息,请参阅 扩展 SDK

下一主题是 移植 XAML 和 UI