Исключения среды выполнения в собственных приложениях .NET
Очень важно выполнять тестирование сборок выпуска приложения универсальной платформы Windows на их целевых платформах, поскольку конфигурации отладки и выпуска совершенно различны. По умолчанию конфигурация отладки использует для компиляции приложения среду выполнения .NET Core, но конфигурация выпуска использует для компиляции приложения в машинный код среду выполнения .NET Native.
Внимание
Сведения о работе с исключениями MissingMetadataException, MissingInteropDataException и MissingRuntimeArtifactException, которые могут возникнуть при тестировании версий для выпуска приложения, см. в разделе "Шаг 4. Устранение проблем с отсутствующими метаданными вручную" в статье Начало работы, а также в разделах Отражение и .NET Native и Справочник по конфигурационному файлу директив среды выполнения (rd.xml).
Отладочные и выпускные сборки
Когда отладочная сборка выполняется в среде выполнения .NET Core, она не компилируется в машинный код. Это делает все службы, обычно предоставляемые средой выполнения, доступными вашему приложению.
С другой стороны, выпускная сборка компилируется в машинный код для целевых платформ, при этом удаляется большинство зависимостей от внешних сред выполнения и библиотек и выполняется серьезная оптимизация кода для достижения максимальной производительности.
При отладке выпускных сборок, которые компилируются с помощью .NET Native, происходит следующее.
Вы используете модуль отладки .NET Native, который отличается от обычных средств отладки .NET.
Размер исполняемого файла максимально уменьшается. Один из способов, которым .NET Native уменьшает размер исполняемого файла, состоит в значительном сокращении сообщений об исключениях времени выполнения. Это более подробно рассматривается в разделе Runtime exception messages .
Код сильно оптимизируется. Это означает, что везде, где это возможно, используется встраивание. (Встраивание перемещает код из внешних подпрограмм в вызывающую подпрограмму.) Тот факт, что .NET Native предоставляет специализированную среду выполнения и реализует агрессивную встраивание влияет на стек вызовов, отображаемый при отладке. Дополнительные сведения см. в разделе Runtime call stack .
Примечание.
Вы можете управлять тем, будут ли отладочные и выпускные сборки компилироваться с помощью цепочки инструментов .NET Native, устанавливая или снимая флажок Компилировать с использованием цепочки инструментов машинного кода .NET . Однако Microsoft Store всегда компилирует рабочую версию приложения с помощью цепочки инструментов .NET Native.
Runtime exception messages
Чтобы свести к минимуму размер исполняемого файла приложения, .NET Native не включает полный текст сообщений об исключениях. В результате исключения среды выполнения, возникающие в выпускной сборке, могут не отображать полный текст сообщений об исключениях. Вместо этого текст может содержать подстроку со ссылкой на дополнительные сведения. Например, сведения об исключении могут выглядеть следующим образом:
Exception thrown: '$16_System.AggregateException' in Unknown Module.
Additional information: AggregateException_ctor_DefaultMessage
If there is a handler for this exception, the program may be safely continued.
Если вам требуется полное сообщение об исключении, запустите отладочную сборку. Например, предыдущие сведения об исключении из выпускной сборки могут выглядеть в отладочной сборке следующим образом:
Exception thrown: 'System.AggregateException' in NativeApp.exe.
Additional information: Value does not fall within the expected range.
Runtime call stack
Из-за встраивания и других видов оптимизации стек вызовов, отображаемый приложением, которое скомпилировано цепочкой инструментов .NET Native, может не позволить вам четко определить путь к исключению среды выполнения.
Чтобы получить полный стек, запустите отладочную сборку.