无论是编写新的 UWP 应用还是迁移现有的 Windows 8.x 应用(以前也称为Microsoft应用商店应用),都可以遵循相同的过程集。 若要创建 .NET Native 应用,请执行以下步骤:
开发通用 Windows 平台(UWP)应用,并测试应用的调试版本,以确保其正常工作。
手动解决缺少的元数据,并重复 步骤 3 ,直到解决所有问题。
注释
如果要将现有 Windows 8.x 应用迁移到 .NET Native,请务必查看 将 Windows 8.x 应用迁移到 .NET Native。
步骤 1:开发和测试 UWP 应用的调试版本
无论是开发新应用还是迁移现有应用,都遵循与任何 Windows 应用相同的过程。
使用适用于 Visual C# 或 Visual Basic 的通用 Windows 应用模板在 Visual Studio 中创建新的 UWP 项目。 默认情况下,所有面向 CoreCLR 的 UWP 应用程序及其发布版本都使用 .NET Native 工具链进行编译。
请注意,使用 .NET Native 工具链和不使用 .NET 本机工具链编译 UWP 应用项目之间存在一些已知的兼容性问题。 有关详细信息,请参阅 迁移指南 。
现在可以针对在本地系统(或模拟器中)运行的 .NET 本机外围应用编写 C# 或 Visual Basic 代码。
重要
开发应用时,请记下代码中任何序列化或反射的使用。
默认情况下,调试版本是通过 JIT 编译来实现快速 F5 部署的,而发布版本则使用 .NET Native 预编译技术进行编译。 这意味着你应该生成和测试应用的调试版本,以确保它们在使用 .NET Native 工具链编译之前正常工作。
步骤 2:处理其他反射和序列化用法
创建运行时指令文件时,会自动将运行时指令文件 Default.rd.xml添加到项目中。 如果在 C# 中开发,则会在项目的 “属性” 文件夹中找到它。 如果在 Visual Basic 中开发,则会在项目的 “我的项目 ”文件夹中找到它。
注释
有关 .NET Native 编译过程的概述,在此过程中阐述了为何需要运行时指令文件的背景信息,请参阅 .NET Native 和 Compilation。
运行时指令文件用于定义应用在运行时所需的元数据。 在某些情况下,文件的默认版本可能足够。 但是,依赖于序列化或反射的某些代码可能需要运行时指令文件中的其他条目。
序列化
有两类序列化程序,两者可能需要运行时指令文件中的其他条目:
非反射序列化器 在 .NET Framework 类库中找到的序列化程序(例如 DataContractSerializer, DataContractJsonSerializer和 XmlSerializer 类)不依赖于反射。 但是,它们确实要求基于要序列化或反序列化的对象生成代码。 有关详细信息,请参阅 序列化和元数据中的 “Microsoft 序列化程序” 部分。
第三方序列化程序。 第三方序列化库(最常见的是 Newtonsoft JSON 序列化程序),通常是基于反射的,需要 *.rd.xml 文件中的条目来支持对象序列化和反序列化。 有关详细信息,请参阅 序列化和元数据中的“第三方序列化程序”部分。
依赖于反射 的
在某些情况下,在代码中使用反射并不明显。 一些常见的 API 或编程模式不被视为反射 API 的一部分,而是依赖于反射才能成功执行。 这包括以下类型实例化和方法构造方法:
有关详细信息,请参阅依赖于反射的
注释
运行时指令文件中使用的类型名称必须完全限定。 例如,该文件必须指定“System.String”而不是“String”。
步骤 3:部署和测试应用的发布版本
更新运行时指令文件后,可以重新生成和部署应用的发布版本。 .NET Native 二进制文件被放置在项目的 属性 对话框中 生成输出路径 文本框指定的目录的 ILC.out 子目录中,位于 编译 选项卡下。没有在此文件夹中的二进制文件未使用 .NET Native 进行编译。 全面测试应用,并在每个目标平台上测试所有方案,包括故障方案。
如果应用无法正常工作(尤其是在运行时引发 MissingMetadataException 或 MissingInteropDataException 异常的情况),请按照下一部分中的说明作, 步骤 4:手动解析缺少的元数据。 启用首次机会异常可能有助于您找到这些错误。
在你测试和调试了应用的调试版本,并确信已经消除了 MissingMetadataException 和 MissingInteropDataException 异常后,你应该将应用程序作为优化的 .NET Native 应用进行测试。 为此,请将当前项目配置从 调试 更改为 发布。
步骤 4:手动解析缺少的元数据
在使用 .NET Native 时,你会遇到的最常见的故障是运行时 MissingMetadataException、MissingInteropDataException或 MissingRuntimeArtifactException 异常,而这些异常在桌面上是不会遇到的。 在某些情况下,缺少元数据可以表现在不可预知的行为,甚至应用故障中。 本部分讨论如何通过将指令添加到运行时指令文件来调试和解决这些异常。 有关运行时指令格式的信息,请参阅 运行时指令(rd.xml) 配置文件参考。 添加运行时指令后,应再次部署并测试应用,并解析任何新的 MissingMetadataException、MissingInteropDataException,以及 MissingRuntimeArtifactException 异常,直到遇到更多异常。
小窍门
指定高级别的运行时指令,使您的应用能够适应代码变更。 建议在命名空间和类型级别而不是成员级别添加运行时指令。 请注意,弹性和较大的二进制文件之间可能存在权衡,如编译时间可能更长。
在解决缺少的元数据异常时,请考虑以下问题:
应用在异常发生之前尝试执行的是什么?
- 例如,它是数据绑定、序列化或反序列化数据还是直接使用反射 API?
这是一个孤立的情况,或者你认为你会遇到其他类型的相同问题吗?
- 例如,序列化应用对象模型中的类型时,将引发 MissingMetadataException 异常。 如果你知道将序列化的其他类型,则可以为这些类型(或者其包含的命名空间)添加运行时指令,具体情况取决于代码的整理程度。
是否可以重写代码,使其不使用反射?
例如,当知道需要哪种类型时,代码是否使用
dynamic
关键字?代码是否在有更优替代方案可用时调用依赖反射的方法?
注释
有关处理因反射差异以及桌面应用和 .NET Native 中元数据可用性而引发的问题的其他信息,请参阅 依赖于反射的 API。
有关在测试应用时处理异常和其他问题的特定示例,请参阅: