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

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

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

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

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

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

API Description Active AssemblyLoadContext
AssemblyLoadContext.LoadFromAssemblyName Load-by-name Экземпляр this.
AssemblyLoadContext.LoadFromAssemblyPath
AssemblyLoadContext.LoadFromNativeImagePath
Загрузка на основе пути. Экземпляр this.
AssemblyLoadContext.LoadFromStream Загрузка из объекта. Экземпляр this.
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.
    • Загружается из указанного пути или необработанного объекта сборки. Если сборка загружена впервые, добавляется соответствующая ссылка на cache-by-name экземпляра activeAssemblyLoadContext.
  4. В любом случае, если сборка только что загружена, AppDomain.AssemblyLoad возникает событие.