Алгоритм загрузки управляемых сборок
Управляемые сборки находятся и загружаются с помощью алгоритма с различными этапами.
Для всех управляемых сборок, за исключением вспомогательных сборок и сборок WinRT
, используется один и тот же алгоритм.
Когда загружаются управляемые сборки?
Чаще всего загрузку управляемой сборки активирует статическая ссылка на сборку. Эти ссылки добавляются в компилятор каждый раз, когда код обращается к типу, который определен в другой сборке. Такие сборки среда выполнения загружает (load-by-name
) по мере необходимости. Точное время загрузки ссылок на статические сборки не определено. Она может отличаться от версий среды выполнения и зависит от оптимизаций, таких как встраивание.
Прямое использование следующих API также активирует нагрузки:
Алгоритм
Ниже приведен алгоритм загрузки управляемой сборки средой выполнения.
Определяется
active
AssemblyLoadContext.- Для ссылки на статическую сборку
active
AssemblyLoadContext обозначает экземпляр, который загрузил ссылающуюся сборку. - Предпочитаемые API-интерфейсы делают экземпляр
active
AssemblyLoadContext явным. - Другие API-интерфейсы выводят
active
AssemblyLoadContext. Для этих API-интерфейсов используется свойство AssemblyLoadContext.CurrentContextualReflectionContext. Если его значение равноnull
, то используется выводимый экземпляр AssemblyLoadContext. - См. таблицу в разделе "Когда загружаются управляемые сборки?" .
- Для ссылки на статическую сборку
Load-by-name
Для методов сборкаactive
AssemblyLoadContext загружается в следующем порядке приоритета:- Проверьте его
cache-by-name
. - Вызовите функцию AssemblyLoadContext.Load.
- AssemblyLoadContext.Default Проверьте кэш экземпляра и запустите логику проверки по умолчанию управляемой сборки. Если сборка загружена впервые, добавляется соответствующая ссылка на
cache-by-name
экземпляра AssemblyLoadContext.Default. - AssemblyLoadContext.Resolving Вызов события для активного assemblyLoadContext.
- AppDomain.AssemblyResolve Вызов события.
- Проверьте его
Для других типов загрузок
active
AssemblyLoadContext загружает сборку в следующем порядке приоритета:- Проверьте его
cache-by-name
. - Загружается из указанного пути или необработанного объекта сборки. Если сборка только что загружена, в экземпляр
cache-by-name
добавляетсяactive
AssemblyLoadContext ссылка.
- Проверьте его
В любом случае, если сборка только что загружена, AppDomain.AssemblyLoad возникает событие.