Класс System.Runtime.Loader.AssemblyLoadContext

В этой статье приводятся дополнительные замечания к справочной документации по этому 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 две точки расширения для реализации разрешения управляемой сборки:

  1. Метод AssemblyLoadContext.Load(AssemblyName) предоставляет первую возможность AssemblyLoadContext разрешения, загрузки и возврата сборки. AssemblyLoadContext.Load(AssemblyName) Если метод возвращаетсяnull, загрузчик пытается загрузить сборку в .AssemblyLoadContext.Default
  2. AssemblyLoadContext.Default Если не удается устранить сборку, исходный AssemblyLoadContext получает второй шанс разрешить сборку. Среда выполнения вызывает Resolving событие.

Кроме того, виртуальный AssemblyLoadContext.LoadUnmanagedDll(String) метод позволяет настроить разрешение неуправляемых сборок по умолчанию. Реализация по умолчанию возвращается null, что приводит к тому, что поиск во время выполнения будет использовать политику поиска по умолчанию. Политика поиска по умолчанию достаточно для большинства сценариев.

Технические проблемы

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

    Внимание

    Загрузка нескольких копий или разных версий сборок платформы может привести к неожиданному и сложному поведению.

    Совет

    Используйте границы процессов при удаленном взаимодействии или взаимодействии между процессами для решения этой проблемы изоляции.

  • Время загрузки сборок может затруднить тестирование и отладку. Сборки обычно загружаются без немедленного разрешения зависимостей. Зависимости загружаются по мере их необходимости:

    • При ветвях кода в зависимой сборке.
    • При загрузке кода ресурсов.
    • Когда код явно загружает сборки.
  • Реализация AssemblyLoadContext.Load(AssemblyName) может добавлять новые зависимости, которые могут быть изолированы, чтобы разрешить существование различных версий. Самая естественная реализация будет размещать эти зависимости в контексте по умолчанию. Тщательное проектирование может изолировать новые зависимости.

  • Одна сборка загружается несколько раз в разные контексты.

    • Это может привести к путанице сообщений об ошибках, например "Не удается привести объект типа Sample.Plugin" для типа Sample.Plugin.
    • Маршалинг по границам изоляции не является тривиальным. Типичным решением является использование интерфейса, определенного в сборке, которая загружается только в контекст загрузки по умолчанию.