Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье показано, как устранить неустранимая ошибка обработчика выполнения, возникающая при получении дескриптора безопасности универсального класса из модуля собственного образа в среде платформа .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.