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


ошибки инициализации платформа .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

Устранение ошибок инициализации

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

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

  • Для платформа .NET Framework 3.5 (и более ранних) приложений: настройте приложение для поддержки платформа .NET Framework 4 или более поздних версий (см. инструкции).

  • Для приложений .NET Framework версии 4: установите распространяемый пакет платформы .NET Framework 4 в составе установки приложения. См. раздел Руководство по развертыванию для разработчиков.

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

Отображение сообщения об ошибках для уведомления о том, что запрошенная версия платформы .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 Description Политика сообщения об ошибках Можно ли отключить сообщение об ошибке?
Узел управляемых EXE-файлов Запускает управляемые EXE-файлы. Отображается в случае отсутствия версии платформы .NET Framework No
Узел управляемого COM Загружает управляемые компоненты COM в процесс. Отображается в случае отсутствия версии платформы .NET Framework Да, установив флаг SEM_FAILCRITICALERRORS
Узел ClickOnce Запускает приложения ClickOnce. Отображается в случае отсутствия версии платформы .NET Framework начиная с .NET Framework 4.5 No
Узел XBAP Запускает приложения WPF XBAP. Отображается в случае отсутствия версии платформы .NET Framework начиная с .NET Framework 4.5 No

Поведение и пользовательский интерфейс 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.

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

Примечание.

.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.

См. также