Начало работы с машинным кодом .NET

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

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

  2. обработайте дополнительные использования отражения и сериализации.

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

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

Примечание

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

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

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

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

  2. Обратите внимание, что существуют некоторые известные проблемы совместимости между проектами приложений 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-интерфейса отражения, но используют отражение для успешного выполнения. К ним относятся следующие методы создания экземпляров типов и методы создания методов:

Дополнительные сведения см. в разделе 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, которые используют отражение.

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

См. также раздел