AssemblyLoadContext Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Представляет концепцию среды выполнения для загрузки сборок.
public ref class AssemblyLoadContext
public ref class AssemblyLoadContext abstract
public class AssemblyLoadContext
public abstract class AssemblyLoadContext
type AssemblyLoadContext = class
Public Class AssemblyLoadContext
Public MustInherit Class AssemblyLoadContext
- Наследование
-
AssemblyLoadContext
Комментарии
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, что приводит к тому, что поиск во время выполнения будет использовать политику поиска по умолчанию. Политика поиска по умолчанию достаточно для большинства сценариев.
Технические проблемы
Невозможно загрузить несколько версий среды выполнения в одном процессе.
Предостережение
Загрузка нескольких копий или разных версий сборок платформы может привести к неожиданному и трудно диагностируемому поведению.
Tip
Используйте границы процесса для удаленного или межпроцессного взаимодействия, чтобы решить проблему изоляции.
Время загрузки сборок может затруднить тестирование и отладку. Сборки обычно загружаются без немедленного разрешения зависимостей. Зависимости загружаются по мере их необходимости:
- Когда код ветвится в зависимую сборку.
- Когда код загружает ресурсы.
- Когда код явно загружает сборки.
Внедрение AssemblyLoadContext.Load(AssemblyName) может добавить новые зависимости, которые необходимо изолировать, чтобы позволить существование различных версий. Самая естественная реализация будет размещать эти зависимости в контексте по умолчанию. Тщательное проектирование может изолировать новые зависимости.
Одна сборка загружается несколько раз в разные контексты.
- Это может привести к путанице сообщений об ошибках, например "Не удается привести объект типа 'Sample.Plugin' к типу 'Sample.Plugin'".
- Маршалинг по границам изоляции не является тривиальным. Типичным решением является использование интерфейса, определенного в сборке, которая загружается только в контекст загрузки по умолчанию.
Конструкторы
| Имя | Описание |
|---|---|
| AssemblyLoadContext() |
Инициализирует новый экземпляр класса AssemblyLoadContext. |
| AssemblyLoadContext(Boolean) |
Инициализирует новый экземпляр AssemblyLoadContext класса со значением, которое указывает, включена ли выгрузка. |
| AssemblyLoadContext(String, Boolean) |
Инициализирует новый экземпляр AssemblyLoadContext класса с именем и значением, которое указывает, включена ли выгрузка. |
Свойства
| Имя | Описание |
|---|---|
| All |
Возвращает коллекцию всех AssemblyLoadContext экземпляров. |
| Assemblies |
Возвращает коллекцию Assembly экземпляров, загруженных в .AssemblyLoadContext |
| CurrentContextualReflectionContext |
Возвращает набор по AssemblyLoadContext последнему вызову EnterContextualReflection(). |
| Default |
Возвращает значение по умолчанию AssemblyLoadContext. Контекст по умолчанию содержит основную сборку приложения и ее статические зависимости. |
| IsCollectible |
Возвращает значение, указывающее, является ли это AssemblyLoadContext коллекционируемым. |
| Name |
Получение имени AssemblyLoadContextобъекта . |
Методы
| Имя | Описание |
|---|---|
| EnterContextualReflection() |
Задает значение CurrentContextualReflectionContext |
| EnterContextualReflection(Assembly) |
Задает значение CurrentContextualReflectionContext для AssemblyLoadContext загруженной сборки. |
| Equals(Object) |
Определяет, равен ли указанный объект текущему объекту. (Унаследовано от Object) |
| Finalize() |
Позволяет объекту пытаться освободить ресурсы и выполнять другие операции очистки перед его восстановлением сборкой мусора. |
| GetAssemblyName(String) |
AssemblyName Возвращает путь сборки. |
| GetHashCode() |
Служит хэш-функцией по умолчанию. (Унаследовано от Object) |
| GetLoadContext(Assembly) |
Возвращает содержащий указанный AssemblyLoadContextAssemblyобъект. |
| GetType() |
Возвращает Type текущего экземпляра. (Унаследовано от Object) |
| Load(AssemblyName) |
При переопределении в производном классе позволяет разрешать сборку на основе его AssemblyName. |
| LoadFromAssemblyName(AssemblyName) |
Разрешает и загружает сборку, заданную ей AssemblyName. |
| LoadFromAssemblyPath(String) |
Загружает содержимое файла сборки по указанному пути. |
| LoadFromNativeImagePath(String, String) |
Загружает содержимое собственного образа управляемого файла сборки по указанному пути. |
| LoadFromStream(Stream, Stream) |
Загружает сборку с общим форматом файлов объектов (COFF), содержащим управляемую сборку, при необходимости включая символы для сборки. |
| LoadFromStream(Stream) |
Загружает сборку с общим форматом файлов объектов (COFF), содержащим управляемую сборку. |
| LoadUnmanagedDll(String) |
Позволяет производным классам загружать неуправляемую библиотеку по имени. |
| LoadUnmanagedDllFromPath(String) |
Загружает неуправляемую библиотеку из указанного пути. |
| MemberwiseClone() |
Создает неглубокую копию текущей Object. (Унаследовано от Object) |
| SetProfileOptimizationRoot(String) |
Задает корневой путь, в котором хранятся профили оптимизации для этого контекста загрузки. |
| StartProfileOptimization(String) |
Запускает оптимизацию профиля для указанного профиля. |
| ToString() |
Возвращает строковое представление этого контекста загрузки. |
| ToString() |
Возвращает строку, представляющую текущий объект. (Унаследовано от Object) |
| Unload() |
Инициирует выгрузку этого AssemblyLoadContext. |
События
| Имя | Описание |
|---|---|
| Resolving |
Происходит, когда разрешение сборки завершается сбоем при попытке загрузить в этот контекст загрузки сборки. |
| ResolvingUnmanagedDll |
Происходит при сбое разрешения собственной библиотеки. |
| Unloading |
Происходит при AssemblyLoadContext выгрузке. |