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


Неустранимая ошибка обработчика выполнения при получении дескриптора безопасности универсального класса из собственного модуля образа в среде платформа .NET Framework

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

Исходная версия продукта: Microsoft платформа .NET Framework 3.5 с пакетом обновления 1 (SP1)
Исходный номер базы знаний: 2468429

Симптомы

При попытке получить дескриптор безопасности универсального класса из модуля машинного образа (Ngen.exe) в среде Microsoft платформа .NET Framework вы получите сообщение об ошибке неустранимая подсистемы выполнения. Эта проблема может возникнуть, если выполняются следующие условия:

  • Приложение включает сборку, которая загружается на нейтральном домене (LoaderOptimization.MultiDomain или LoaderOptimization.MultiDomainHost).
  • Сборка содержит экземпляр универсального класса.
  • Сборка была скомпилирована в собственный образ с помощью средства генератора собственных образов (Ngen.exe).
  • Приложение загружает собственный образ в домен приложения.
  • Приложение пытается использовать универсальный класс из второго домена приложения без загрузки собственного образа в этот домен приложения.

Причина

Среда CLR может разрешить коду в исходном образе, нейтральном доменом, выполняться во втором домене приложения, даже если собственный образ еще не загружен в этот домен приложения. Если среда CLR пытается получить дескриптор безопасности перед загрузкой собственного образа (например, при создании делегата для метода экземпляра универсального типа), может возникнуть неустранимая ошибка подсистемы выполнения.

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

Обходные пути

Чтобы обойти эту проблему, используйте один из следующих методов:

  • Явно загружайте сборку в каждый домен приложения, который будет использовать его. Например, загрузите сборку Assembly.Load , вызвав метод.

  • Не загружайте сборку как нейтрализуемую доменом.

    Замечание

    Это решение может повлиять на размер рабочего набора приложения.

  • Не используйте средство Ngen.exe для создания собственного образа сборки.

    Замечание

    Это решение может повлиять на производительность приложения.

  • Обновите приложение до платформа .NET Framework версии 4. Все проблемы, которые, как известно, вносят свой вклад в эту проблему, были решены в платформа .NET Framework 4.