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


Алгоритм загрузки управляемой сборки

Управляемые сборки располагаются и загружаются алгоритмом, который состоит из различных этапов.

Все управляемые сборки, кроме спутниковых сборок и WinRT сборок, используют тот же самый алгоритм.

Когда загружаются управляемые сборки?

Наиболее распространенный механизм активации нагрузки управляемой сборки — это ссылка на статическую сборку. Эти ссылки вставляются компилятором всякий раз, когда код использует тип, определенный в другой сборке. Эти сборки загружаются (load-by-name) по мере необходимости средой выполнения. Точное время загрузки статических ссылок на сборку не указано. Она может варьироваться между версиями среды выполнения и зависит от оптимизаций, таких как встраивание.

Прямое использование следующих API также активирует нагрузки:

API (Интерфейс программирования приложений) Описание Active AssemblyLoadContext
AssemblyLoadContext.LoadFromAssemblyName Load-by-name Этот экземпляр.
AssemblyLoadContext.LoadFromAssemblyPath
AssemblyLoadContext.LoadFromNativeImagePath
Загрузка по пути. Этот экземпляр.
AssemblyLoadContext.LoadFromStream Загрузка из объекта. Этот экземпляр.
Assembly.LoadFile Загрузка из пути в новом AssemblyLoadContext экземпляре Новый AssemblyLoadContext экземпляр.
Assembly.LoadFrom Загрузка из указанного пути в экземпляре AssemblyLoadContext.Default.
Добавляет обработчик AppDomain.AssemblyResolve Обработчик загружает зависимости сборки из своего каталога.
Экземпляр AssemblyLoadContext.Default.
Assembly.Load(AssemblyName)
Assembly.Load(String)
Assembly.LoadWithPartialName
Load-by-name. Определено на основании вызывающего абонента.
Предпочитайте AssemblyLoadContext методы.
Assembly.Load(Byte[])
Assembly.Load(Byte[], Byte[])
Загрузка из объекта в новом AssemblyLoadContext экземпляре. Новый AssemblyLoadContext экземпляр.
Type.GetType(String)
Type.GetType(String, Boolean)
Type.GetType(String, Boolean, Boolean)
Load-by-name. Определено на основании вызывающего абонента.
Предпочитайте методы Type.GetType с аргументом assemblyResolver.
Assembly.GetType Если тип name описывает универсальный тип с полным квалифицированным именем сборки, вызовите Load-by-name. Определено на основании вызывающего абонента.
Предпочитайте Type.GetType использовать имена квалифицированных типов сборки.
Activator.CreateInstance(String, String)
Activator.CreateInstance(String, String, Object[])
Activator.CreateInstance(String, String, Boolean, BindingFlags, Binder, Object[], CultureInfo, Object[])
Load-by-name. Определено на основании вызывающего абонента.
Предпочитайте Activator.CreateInstance методы, принимающие Type аргумент.

Алгоритм

Следующий алгоритм описывает, как среда выполнения загружает управляемую сборку.

  1. Определите activeAssemblyLoadContext.

  2. Методы Load-by-name загружают сборку activeAssemblyLoadContext в следующем порядке приоритета:

  3. Для других типов загрузок activeAssemblyLoadContext загружает сборку в следующем порядке приоритета:

    • Проверьте его cache-by-name.
    • Загружается из указанного пути или из необработанного объектного файла сборки. Если сборка только что загружена, в экземпляр active добавляется ссылка AssemblyLoadContextcache-by-name.
  4. В любом случае, если сборка загружена недавно, то событие AppDomain.AssemblyLoad будет вызвано.