通过


.NET Native 入门

重要

使用 .NET 和 Native AOT 现代化您的 UWP 应用:如果您正在开发新的 UWP 应用或希望更新现有的 UWP 应用,我们建议您使用支持 Native AOT 的最新 .NET 版本的 UWP,而不是使用 .NET Native。 对新式.NET 的 UWP 支持现已正式发布,并且在 Visual Studio 2026 中是 C# UWP 应用的默认项目类型。 这样可以访问最新的.NET和 C# 功能、改进的工具和调试支持,以及更快的生成时间。 .NET Native 将继续接收安全性和可靠性修补程序,但不会接收新功能更新。

无论是编写新的 UWP 应用还是迁移现有的 Windows 8.x 应用(以前也称为Microsoft Store应用),都可以遵循相同的过程集。 若要创建.NET本机应用,请执行以下步骤:

  1. 开发通用 Windows 平台 (UWP)应用,并测试应用的调试版本以确保其正常工作。

  2. 处理其他反射和序列化用法

  3. 部署并测试应用的发布版本

  4. 手动解决缺少的元数据,并重复 步骤 3 ,直到解决所有问题。

注释

如果要将现有 Windows 8.x 应用迁移到 .NET Native,请务必查看 将 Windows 8.x 应用迁移到 .NET Native

步骤 1:开发和测试 UWP 应用的调试版本

无论是开发新应用还是迁移现有应用,都遵循与任何Windows应用相同的过程。

  1. 使用适用于 Visual C# 或 Visual Basic 的通用Windows应用模板在 Visual Studio 中创建新的 UWP 项目。 默认情况下,所有面向 CoreCLR 的 UWP 应用程序及其发布版本都使用 .NET 本机工具链进行编译。

  2. 请注意,使用 .NET Native 工具链和不使用本机工具链编译 UWP 应用项目之间存在一些已知的兼容性问题。 有关详细信息,请参阅 迁移指南

现在可以针对在本地系统(或模拟器中)运行的.NET本机外围应用编写 C# 或Visual Basic代码。

重要

开发应用时,请记下代码中任何序列化或反射的使用。

默认情况下,调试版本是 JIT 编译的,以启用快速 F5 部署,而发布版本是使用 .NET 本机预编译技术编译的。 这意味着,你应该生成和测试应用的调试版本,以确保它们在使用 .NET Native 工具链编译之前正常工作。

步骤 2:处理其他反射和序列化用法

创建运行时指令文件时,会自动将运行时指令文件 Default.rd.xml添加到项目中。 如果在 C# 中开发,则会在项目的 “属性” 文件夹中找到它。 如果在 Visual Basic 中开发,则会在 project 的 My Project 文件夹中找到它。

注释

有关 .NET Native 编译过程的概述,并提供为何需要运行时指令文件的背景信息,请参阅 .NET Native and Compilation

运行时指令文件用于定义应用在运行时所需的元数据。 在某些情况下,文件的默认版本可能足够。 但是,依赖于序列化或反射的某些代码可能需要运行时指令文件中的其他条目。

序列化

有两类序列化程序,两者可能需要运行时指令文件中的其他条目:

  • 非反射序列化器 在 .NET Framework 类库中找到的序列化程序(如 DataContractSerializerDataContractJsonSerializerXmlSerializer 类)不依赖于反射。 但是,它们确实要求基于要序列化或反序列化的对象生成代码。 有关详细信息,请参阅 序列化和元数据中的“Microsoft序列化程序”部分。

  • 第三方序列化程序。 第三方序列化库(最常见的是 Newtonsoft JSON 序列化程序),通常是基于反射的,需要 *.rd.xml 文件中的条目来支持对象序列化和反序列化。 有关详细信息,请参阅 序列化和元数据中的“第三方序列化程序”部分。

依赖于反射 的 方法

在某些情况下,在代码中使用反射并不明显。 一些常见的 API 或编程模式不被视为反射 API 的一部分,而是依赖于反射才能成功执行。 这包括以下类型实例化和方法构造方法:

有关详细信息,请参阅依赖于反射的 API。

注释

运行时指令文件中使用的类型名称必须完全限定。 例如,该文件必须指定“System.String”而不是“String”。

步骤 3:部署和测试应用的发布版本

更新运行时指令文件后,可以重新生成和部署应用的发布版本。 .NET Native二进制文件放置在项目属性对话框的生成输出路径文本框中指定的目录的ILC.out子目录中,编译选项卡。如果不在此文件夹中的二进制文件尚未使用.NET Native进行编译。 全面测试应用,并在每个目标平台上测试所有方案,包括故障方案。

如果应用无法正常工作(尤其是在运行时引发 MissingMetadataExceptionMissingInteropDataException 异常的情况),请按照下一部分中的说明作, 步骤 4:手动解析缺少的元数据。 启用首次机会异常可能有助于您找到这些错误。

在测试和调试应用的调试版本并且确信已消除 MissingMetadataExceptionMissingInteropDataException 异常时,应将应用测试为优化的.NET本机应用。 为此,请将当前项目配置从 调试 更改为 发布

步骤 4:手动解析缺少的元数据

在.NET Native中,您将遇到在桌面上不会遇到的最常见故障是运行时 MissingMetadataExceptionMissingInteropDataExceptionMissingRuntimeArtifactException 异常。 在某些情况下,缺少元数据可以表现在不可预知的行为,甚至应用故障中。 本部分讨论如何通过将指令添加到运行时指令文件来调试和解决这些异常。 有关运行时指令格式的信息,请参阅 运行时指令(rd.xml) 配置文件参考。 添加运行时指令后,应再次部署并测试应用,并解决任何新的 MissingMetadataExceptionMissingInteropDataException,以及 MissingRuntimeArtifactException 异常,直到不再遇到异常。

小窍门

指定高级别的运行时指令,使您的应用能够适应代码变更。 建议在命名空间和类型级别而不是成员级别添加运行时指令。 请注意,弹性和较大的二进制文件之间可能存在权衡,如编译时间可能更长。

在解决缺少的元数据异常时,请考虑以下问题:

  • 应用在异常发生之前尝试执行的是什么?

    • 例如,它是数据绑定、序列化或反序列化数据还是直接使用反射 API?
  • 这是一个孤立的情况,或者你认为你会遇到其他类型的相同问题吗?

    • 例如,序列化应用对象模型中的类型时,将引发 MissingMetadataException 异常。 如果你知道将序列化的其他类型,则可以为这些类型(或者其包含的命名空间)添加运行时指令,具体情况取决于代码的整理程度。
  • 是否可以重写代码,使其不使用反射?

    • 例如,当知道需要哪种类型时,代码是否使用 dynamic 关键字?

    • 代码是否在有更优替代方案可用时调用依赖反射的方法?

注释

有关处理因反射和桌面应用程序中.NET Native元数据可用性差异所引发问题的更多信息,请参阅依赖反射的APIs

有关在测试应用时处理异常和其他问题的特定示例,请参阅:

另请参阅