Начало работы с машинным кодом .NET
Если вы пишете новое приложение UWP или переносите существующее приложение Windows 8.x (ранее называемое приложением Microsoft Store), вы можете выполнить тот же набор процедур. Чтобы создать приложение .NET Native, выполните следующие действия.
Разработайте приложение универсальная платформа Windows (UWP) и проверьте отладочные сборки приложения, чтобы убедиться, что она работает правильно.
обработайте дополнительные использования отражения и сериализации.
Вручную разрешите отсутствующие метаданные и повторяйте шаг 3 до тех пор, пока все вопросы не будут разрешены.
Примечание.
Если вы переносите существующее приложение Windows 8.x в .NET Native, обязательно просмотрите перенос приложения Windows 8.x в .NET Native.
Шаг 1. Разработка и тестирование отладочных сборок приложения UWP
При разработке нового приложения или миграции существующего выполняется тот же процесс, что и для любого приложения Windows.
Создайте проект UWP в Visual Studio с помощью шаблона универсального приложения Windows для Visual C# или Visual Basic. По умолчанию все приложения UWP предназначены для CoreCLR, и их выпускаемые сборки компилируются с помощью цепочки инструментов машинного кода .NET.
Обратите внимание, что существуют некоторые известные проблемы совместимости между проектами приложений UWP, скомпилированными с помощью цепочки инструментов машинного кода .NET и без нее. Обратитесь к руководство по миграции для получения дополнительных сведений.
Теперь можно написать код C# или Visual Basic в области поверхности .NET Native, которая выполняется в локальной системе (или в симуляторе).
Внимание
При разработке приложения, обратите внимание на любое использование сериализации или отражения в коде.
По умолчанию сборки отладки компилируются JIT для быстрого развертывания F5, а сборки выпусков компилируются с помощью технологии предварительной компиляции .NET Native. Это означает, что вам следует создать и протестировать отладочные сборки приложения, чтобы проверить правильность их работы, перед тем как компилировать их с помощью цепочки инструментов машинного кода .NET.
Шаг 2. Обработка дополнительных операций использования отражения и сериализации
Файл директив среды выполнения по умолчанию Default.RD.XML автоматически добавляется в проект при его создании. При разработке на языке C# он находится в папке Properties вашего проекта. При разработке на языке Visual Basic он находится в папке My Project вашего проекта.
Примечание.
Общие сведения о процессе компиляции машинного кода .NET, обосновывающие необходимость файла директив среды выполнения, см. в разделе Машинный код .NET и компиляция.
Файл директив среды выполнения служит для определения метаданных, которые понадобятся вашему приложению во время выполнения. В некоторых случаях версии этого файла по умолчанию может быть достаточно. Однако для кода, в котором используется сериализация или отражение, могут потребоваться дополнительные записи в файле директив среды выполнения.
Сериализация
Существует две категории сериализаторов и обе могут потребовать дополнительных записей в файле директив среды выполнения:
сериализаторы, работающие без использования отражения. сериализаторы из библиотеки классов .NET Framework, например, DataContractSerializer, DataContractJsonSerializerи классы XmlSerializer не используют отражение. Тем не менее, они требуют генерировать код на основе объекта для сериализации или десериализации. Дополнительные сведения см. в разделе "Сериализаторы Microsoft" в Serialization and Metadata.
Сериализаторы сторонних поставщиков. Библиотеки сериализации сторонних поставщиков, наиболее распространенной из которых является сериализатор Newtonsoft JSON, обычно работают на основе отражения и требуют выполнения записей в файл *. rd.xml файл для поддержки сериализации и десериализации объектов. Дополнительные сведения см. в разделе "Сериализаторы сторонних поставщиков" в Serialization and Metadata.
Методы, основанные на отражении
В некоторых случаях использование отражения в коде не очевидно. Некоторые общие интерфейсы API или шаблоны программирования не считаются частью API-интерфейса отражения, но используют отражение для успешного выполнения. К ним относятся следующие методы создания экземпляров типов и методы создания методов:
Метод Type.MakeGenericType
методы Array.CreateInstance и Type.MakeArrayType
метод MethodInfo.MakeGenericMethod ;
Дополнительные сведения см. в разделе APIs That Rely on Reflection.
Примечание.
Имена типов в файлах директив среды выполнения должны быть полными. Например, файл должен определять "System.String" вместо "String".
Шаг 3. Развертывание и тестирование выпускаемых сборок приложения
После обновления файла директив среды выполнения можно перестроить и развернуть сборки выпуска приложения. Двоичные файлы .NET Native помещаются в подкаталог ILC.out каталога, указанного в текстовом поле пути сборки диалогового окна "Свойства проекта", вкладка "Компиляция". Двоичные файлы, которые не находятся в этой папке, не были скомпилированы с помощью .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, см . в API, которые зависят от отражения.
Конкретные примеры обработки исключений и других проблем, возникающих при тестировании приложения, см. в: