Начало работы с .NET Native

Это важно

Модернизируйте ваше приложение UWP с помощью .NET и Native AOT: если вы разрабатываете новое приложение UWP или хотите модернизировать существующее приложение UWP, рекомендуется использовать поддержку UWP для последней версии .NET с помощью Native AOT вместо .NET Native. Поддержка UWP в современном .NET теперь общедоступна и является типом проекта по умолчанию для приложений UWP на C# в Visual Studio 2026. Это обеспечивает доступ к новейшим функциям .NET и C#, улучшенным инструментам и поддержке отладки и более быстрому времени сборки. .NET Native будет продолжать получать исправления безопасности и надежности, но не будут получать новые обновления компонентов.

Если вы пишете новое приложение UWP или переносите существующее приложение Windows 8.x (ранее называемое приложением Microsoft Store), вы можете выполнить тот же набор процедур. Чтобы создать приложение .NET Native, выполните следующие действия.

  1. Разработайте приложение на платформе Universal Windows (UWP) и протестируйте отладочные сборки, чтобы убедиться, что оно работает правильно.

  2. Обрабатывать дополнительное использование рефлексии и сериализации.

  3. Разверните и протестируйте релизные сборки вашего приложения.

  4. вручную разрешить отсутствующие метаданныеи повторять шаг 3, пока не будут устранены все проблемы.

Замечание

Если вы переносите существующее приложение Windows 8.x на .NET Native, обязательно изучите документ Migrating Your Windows 8.x App to .NET Native.

Шаг 1. Разработка и тестирование сборок отладки приложения UWP

Независимо от того, разрабатываете ли вы новое приложение или переносите существующее приложение, выполните тот же процесс, что и для любого Windows приложения.

  1. Создайте проект UWP в Visual Studio с помощью шаблона универсального приложения Windows для Visual C# или Visual Basic. По умолчанию все приложения UWP предназначены для CoreCLR и их релизные сборки компилируются с помощью инструментария .NET Native.

  2. Обратите внимание, что существуют некоторые известные проблемы совместимости между компиляцией проектов приложений UWP с цепочкой инструментов .NET Native и без нее. Дополнительные сведения см. в руководстве по миграции .

Теперь можно написать код C# или Visual Basic в области поверхности .NET Native, которая выполняется в локальной системе (или в симуляторе).

Это важно

При разработке приложения обратите внимание на любое использование сериализации или отражения в коде.

По умолчанию отладочные сборки JIT-компилируются для быстрого развертывания F5, а релизные сборки компилируются с использованием технологии предварительной компиляции .NET Native. Это означает, что вы должны создавать и тестировать отладочные сборки приложения, чтобы убедиться, что они работают нормально, прежде чем компилировать их с помощью цепочки инструментов .NET Native.

Шаг 2. Работа с дополнительным использованием рефлексии и сериализации

Файл директив среды выполнения, Default.rd.xml, автоматически добавляется в проект при его создании. Если вы разрабатываете в C#, оно находится в папке свойств проекта. Если вы разрабатываете на Visual Basic, она находится в папке вашего проекта My Project.

Замечание

Общие сведения о процессе компиляции .NET Native, который содержит общие сведения о том, почему требуется файл директив среды выполнения, см. в разделе .NET Native and Compilation.

Файл директив среды выполнения используется для определения метаданных, необходимых приложению во время выполнения. В некоторых случаях версия файла по умолчанию может быть достаточной. Однако некоторые коды, основанные на сериализации или отражении, могут потребовать дополнительных записей в файле директив среды выполнения.

сериализация

Существует две категории сериализаторов, и оба могут потребовать дополнительных записей в файле директив среды выполнения:

  • Сериализаторы, не использующие отражение. Сериализаторы, найденные в библиотеке классов .NET Framework, такие как классы DataContractSerializer, DataContractJsonSerializer и XmlSerializer, не полагаются на отражение. Однако им требуется создать код на основе объекта, который будет сериализован или десериализирован. Дополнительные сведения см. в разделе "Сериализаторы Майкрософт" в разделе Сериализация и метаданные.

  • Сторонние сериализаторы. Сторонние библиотеки сериализации, наиболее распространенные из которых являются сериализатором Newtonsoft JSON, обычно работают на основе рефлексии и требуют внесения записей в файл *.rd.xml для обеспечения сериализации и десериализации объектов. Дополнительные сведения см. в разделе "Сторонние сериализаторы" сериализации и метаданных.

методы , основанные на рефлексии

В некоторых случаях использование отражения в коде не очевидно. Некоторые распространенные API или шаблоны программирования не считаются частью API отражения, но полагаются на отражение для успешного выполнения. К ним относятся следующие методы создания экземпляров типов и методов построения методов:

Дополнительные сведения см. в API, основанном наотражении.

Замечание

Имена типов, используемые в файлах директив среды выполнения, должны быть полностью квалифицированными. Например, файл должен указывать "System.String" вместо "String".

Шаг 3: Развертывание и тестирование релизных сборок вашего приложения

После обновления файла директив среды выполнения можно перестроить и развернуть релизные сборки вашего приложения. .NET Native двоичные файлы помещаются в подкаталог ILC.out каталога, указанного в текстовом поле пути вывода Build диалогового окна Свойства, вкладка Компиляция. Двоичные файлы, которые не находятся в этой папке, не были скомпилированы с использованием .NET Native. Тщательно протестируйте приложение и протестируйте все сценарии, включая сценарии сбоя, на каждой из целевых платформ.

Если ваше приложение не работает должным образом (особенно в случаях, когда оно вызывает исключение MissingMetadataException или MissingInteropDataException во время выполнения), следуйте инструкциям в следующем разделе , шаг 4: Вручную разрешите отсутствующие метаданные. Включение исключений первого шанса может помочь найти эти ошибки.

Когда вы проверили и отладили отладочные сборки вашего приложения и уверены, что устранили исключения MissingMetadataException и MissingInteropDataException, следует протестировать приложение как оптимизированное .NET Native. Для этого измените активную конфигурацию проекта с Debug на Release.

Шаг 4. Разрешение отсутствующих метаданных вручную

Наиболее распространенная проблема, с которой вы столкнетесь в .NET Native, а не на настольной платформе, — это исключение времени выполнения MissingMetadataException, MissingInteropDataException или MissingRuntimeArtifactException. В некоторых случаях отсутствие метаданных может проявляться в непредсказуемом поведении или даже в сбоях приложения. В этом разделе описывается, как выполнять отладку и разрешение этих исключений путем добавления директив в файл директив среды выполнения. Сведения о формате директив среды выполнения см. в разделе Директивы среды выполнения (rd.xml) Справочник по файлу конфигурации. После добавления директив среды выполнения необходимо развернуть и проверить приложение еще раз и разрешить все новые MissingMetadataException, MissingInteropDataExceptionи исключений MissingRuntimeArtifactException, пока не возникнет никаких исключений.

Подсказка

Укажите директивы среды выполнения на высоком уровне, чтобы обеспечить устойчивость приложения к изменениям кода. Рекомендуется добавлять директивы среды выполнения на уровне пространства имен и типов, а не на уровне члена. Обратите внимание, что существует компромисс между устойчивостью и большими двоичными файлами с более длительным временем компиляции.

При устранении отсутствующих исключений метаданных рассмотрите следующие проблемы:

  • Что приложение пыталось сделать до возникновения исключения?

    • Например, это была привязка данных, сериализация или десериализация данных, или непосредственное использование API отражения?
  • Это изолированный случай или вы считаете, что вы столкнетесь с той же проблемой для других типов?

    • Например, при сериализации типа в объектной модели приложения возникает исключение MissingMetadataException. Если вы знаете другие типы, которые будут сериализованы, можно добавить директивы среды выполнения для этих типов (или для их содержащих пространств имен в зависимости от того, насколько хорошо организован код) одновременно.
  • Можно ли переписать код так, чтобы он не использовал отражение?

    • Например, код использует ключевое слово dynamic, если вы знаете, какой тип следует ожидать?

    • Вызывает ли код метод, который зависит от отражения, когда доступна более эффективная альтернатива?

Замечание

Дополнительные сведения о обработке проблем, связанных с различиями в отражении и доступности метаданных в классических приложениях и .NET Native, см. в разделе APIs, которые зависят от отражения.

Примеры обработки исключений и других проблем, возникающих при тестировании приложения, см. в следующих примерах:

См. также