Поделиться через


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

Чтобы получить полный стек, запустите отладочную сборку.

См. также