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


Ошибки инициализации .NET Framework: управление взаимодействием с пользователем

Замечание

Эта статья связана с .NET Framework. Он не применяется к более новым реализациям .NET, включая .NET 6 и более поздние версии.

Система активации CLR определяет версию CLR, которая будет использоваться для выполнения управляемого кода приложения. В некоторых случаях система активации может не найти версию среды CLR для загрузки. Эта ситуация обычно возникает, когда приложению требуется неверная или не установленная на данном компьютере версия CLR. Если запрошенная версия не найдена, система активации CLR возвращает код ошибки HRESULT из вызываемой функции или интерфейса и может отобразить сообщение об ошибке пользователю, выполняющему приложение. В этой статье представлен список кодов HRESULT и объясняется, как предотвратить отображение сообщения об ошибке.

Среда CLR предоставляет инфраструктуру ведения журнала для отладки проблем с активацией СРЕДЫ CLR, как описано в разделе "Практическое руководство. Отладка проблем с активацией СРЕДЫ CLR". Эту инфраструктуру не следует путать с журналами привязки сборок, которые совершенно отличаются.

Коды HRESULT для активации CLR

API активации CLR возвращают коды HRESULT, чтобы сообщить о результатах операции активации узлу. Хосты CLR всегда должны консультироваться с этими возвращаемыми значениями перед выполнением дополнительных операций.

  • CLR_E_SHIM_RUNTIMELOAD

  • CLR_E_SHIM_RUNTIMEEXPORT

  • CLR_E_SHIM_INSTALLROOT

  • CLR_E_SHIM_INSTALLCOMP

  • CLR_E_SHIM_LEGACYRUNTIMEALREADYBOUND

  • CLR_E_SHIM_SHUTDOWNINPROGRESS

Пользовательский интерфейс для ошибок инициализации

Если система активации CLR не может загрузить правильную версию среды выполнения, требуемую приложением, отобразится сообщение об ошибке для пользователей, чтобы сообщить им о том, что компьютер не настроен правильно для запуска приложения, и предоставляет им возможность исправить ситуацию. В этой ситуации обычно отображается следующее сообщение об ошибке. Пользователь может выбрать "Да" , чтобы перейти на веб-сайт Майкрософт, где он может скачать правильную версию .NET Framework для приложения.

Диалоговое окно

Разрешение ошибки инициализации

В качестве разработчика вы можете управлять сообщением об ошибке инициализации .NET Framework. Например, можно использовать флаг API, чтобы предотвратить отображение сообщения, как описано в следующем разделе. Однако вам по-прежнему необходимо устранить проблему, которая не позволила приложению загружать запрошенную среду выполнения. В противном случае приложение может не выполняться вообще или некоторые функции могут быть недоступны.

Чтобы устранить основные проблемы и обеспечить лучший интерфейс пользователя (меньше сообщений об ошибках), рекомендуется выполнить следующие действия.

Управление сообщением об ошибке

Отображение сообщения об ошибке, сообщающей, что запрошенная версия .NET Framework не найдена, может восприниматься как полезная функция или незначительное раздражение. В любом случае вы можете управлять этим пользовательским интерфейсом, передав флаги в API активации.

Метод ICLRMetaHostPolicy::GetRequestedRuntime принимает элемент перечисления METAHOST_POLICY_FLAGS в качестве входных данных. Можно включить флаг METAHOST_POLICY_SHOW_ERROR_DIALOG, чтобы запросить сообщение об ошибке, если запрошенная версия среды CLR не найдена. По умолчанию сообщение об ошибке не отображается. (Метод ICLRMetaHost::GetRuntime не принимает этот флаг и не предоставляет другой способ отображения сообщения об ошибке.)

Windows предоставляет функцию SetErrorMode , которую можно использовать для объявления того, должны ли отображаться сообщения об ошибках в результате кода, выполняемого в процессе. Можно указать флаг SEM_FAILCRITICALERRORS, чтобы предотвратить отображение сообщения об ошибке.

Однако в некоторых сценариях важно переопределить параметр SEM_FAILCRITICALERRORS, заданный процессом приложения. Например, если у вас есть собственный COM-компонент, который размещает CLR и размещен в процессе, где установлен SEM_FAILCRITICALERRORS, может потребоваться переопределение флага в зависимости от воздействия отображения сообщений об ошибках в этом процессе приложения. В этом случае можно использовать один из следующих флагов для игнорирования SEM_FAILCRITICALERRORS:

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

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

Хост CLR Описание Политика сообщений об ошибке Можно ли отключить сообщение об ошибке?
Управляемый хост EXE Запускает управляемые исполняемые файлы. Отображается в случае отсутствия версии .NET Framework нет
Управляемый хост COM Загружает управляемые COM-компоненты в процесс. Отображается в случае отсутствия версии .NET Framework Да, установив параметр SEM_FAILCRITICALERRORS
Хост ClickOnce Запускает приложения ClickOnce. Отображается в случае отсутствия версии .NET Framework, начиная с .NET Framework 4.5. нет
Хост XBAP Запускает приложения WPF XBAP. Отображается в случае отсутствия версии .NET Framework, начиная с .NET Framework 4.5. нет

Поведение и пользовательский интерфейс Windows 8

Система активации СРЕДЫ CLR обеспечивает то же поведение и пользовательский интерфейс в Windows 8, что и в других версиях операционной системы Windows, за исключением случаев, когда возникают проблемы с загрузкой среды CLR 2.0. Windows 8 включает .NET Framework 4.5, которая использует CLR 4.5. Однако Windows 8 не включает .NET Framework 2.0, 3.0 или 3.5, которые используют CLR 2.0. В результате приложения, зависящие от CLR 2.0, по умолчанию не выполняются на Windows 8. Вместо этого они отображают следующее диалоговое окно, чтобы разрешить пользователям устанавливать .NET Framework 3.5. Пользователи также могут включить .NET Framework 3.5 на панели управления. Оба варианта рассматриваются в статье "Установка .NET Framework 3.5 в Windows 11, Windows 10, Windows 8.1 и Windows 8".

Диалоговое окно установки на Windows 8 версии 3.5

Замечание

Платформа .NET Framework 4.5 заменяет .NET Framework 4 (CLR 4) на компьютере пользователя. Таким образом, приложения .NET Framework 4 работают без отображения этого диалогового окна в Windows 8.

При установке .NET Framework 3.5 пользователи могут запускать приложения, зависящие от .NET Framework 2.0, 3.0 или 3.5 на своих компьютерах с Windows 8. Они также могут запускать приложения .NET Framework 1.0 и 1.1, если эти приложения явно не настроены для запуска только в .NET Framework 1.0 или 1.1. См. статью "Миграция с .NET Framework 1.1".

Начиная с .NET Framework 4.5, ведение журнала активации CLR улучшено, включая записи журнала, фиксирующие, когда и почему отображается сообщение об ошибке инициализации. Дополнительные сведения см. в разделе "Практическое руководство. Отладка проблем с активацией среды CLR".

См. также