Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье приводятся дополнительные замечания к справочной документации по этому API.
AssemblyLoadContext представляет собой контекст загрузки. В теории контекст загрузки обозначает область для загрузки, разрешения и потенциально выгрузки набора сборок.
Существует AssemblyLoadContext в первую очередь для обеспечения изоляции загрузки сборок. Он позволяет загружать несколько версий одной сборки в рамках одного процесса. Он заменяет механизмы изоляции, предоставляемые множеством экземпляров AppDomain в .NET Framework.
Замечание
- AssemblyLoadContext не предоставляет никаких функций безопасности. Весь код имеет полные разрешения процесса.
- Только в .NET Core 2.0 — 2.2 AssemblyLoadContext является абстрактным классом. Чтобы создать конкретный класс в этих версиях, реализуйте AssemblyLoadContext.Load(AssemblyName) метод.
Использование в среде выполнения
Среда выполнения реализует два контекста загрузки сборки:
- AssemblyLoadContext.Default представляет контекст среды выполнения по умолчанию, который используется для основной сборки приложения и его статических зависимостей.
- Метод Assembly.LoadFile(String) изолирует сборки, которые он загружает, путем создания экземпляра наиболее простого AssemblyLoadContext. Она имеет упрощенную схему изоляции, которая загружает каждую сборку самостоятельно AssemblyLoadContext без разрешения зависимостей.
Использование приложений
Приложение может создать собственное AssemblyLoadContext решение для расширенных сценариев. Настройка фокусируется на определении механизмов разрешения зависимостей.
Предоставляет AssemblyLoadContext две точки расширения для реализации разрешения управляемой сборки:
- Метод AssemblyLoadContext.Load(AssemblyName) предоставляет AssemblyLoadContext первую возможность разрешить, загрузить и вернуть сборку. Если метод AssemblyLoadContext.Load(AssemblyName) возвращает
null, загрузчик пытается загрузить сборку в AssemblyLoadContext.Default. - AssemblyLoadContext.Default Если не удается разрешить сборку, исходный AssemblyLoadContext получает второй шанс разрешить её. Среда выполнения вызывает Resolving событие.
Кроме того, виртуальный AssemblyLoadContext.LoadUnmanagedDll(String) метод позволяет настроить разрешение неуправляемых сборок по умолчанию. Реализация по умолчанию возвращает null, что приводит к тому, что поиск во время выполнения будет использовать политику поиска по умолчанию. Политика поиска по умолчанию достаточно для большинства сценариев.
Технические проблемы
Невозможно загрузить несколько версий среды выполнения в одном процессе.
Осторожность
Загрузка нескольких копий или разных версий сборок платформы может привести к неожиданному и трудно диагностируемому поведению.
Подсказка
Используйте границы процесса для удаленного или межпроцессного взаимодействия, чтобы решить проблему изоляции.
Время загрузки сборок может затруднить тестирование и отладку. Сборки обычно загружаются без немедленного разрешения зависимостей. Зависимости загружаются по мере их необходимости:
- Когда код ветвится в зависимую сборку.
- Когда код загружает ресурсы.
- Когда код явно загружает сборки.
Внедрение AssemblyLoadContext.Load(AssemblyName) может добавить новые зависимости, которые необходимо изолировать, чтобы позволить существование различных версий. Самая естественная реализация будет размещать эти зависимости в контексте по умолчанию. Тщательное проектирование может изолировать новые зависимости.
Одна сборка загружается несколько раз в разные контексты.
- Это может привести к путанице сообщений об ошибках, например "Не удается привести объект типа 'Sample.Plugin' к типу 'Sample.Plugin'".
- Маршалинг по границам изоляции не является тривиальным. Типичным решением является использование интерфейса, определенного в сборке, которая загружается только в контекст загрузки по умолчанию.