Algorithme de chargement d’assembly managé
Les assemblys managés se trouvent et sont chargés avec un algorithme à différentes étapes.
Tous les assemblys managés, à l’exception des assemblys satellites et des assemblys WinRT
, utilisent le même algorithme.
Quand les assemblys managés sont-ils chargés ?
Le mécanisme le plus courant pour déclencher une charge d’assembly managé est une référence d’assembly statique. Ces références sont insérées par le compilateur chaque fois que le code utilise un type défini dans un autre assembly. Ces assemblys sont chargés (load-by-name
) selon les besoins du runtime. Le moment exact du chargement des références d’assembly statique n’est pas spécifié. Il peut varier entre les versions de runtime et est influencé par des optimisations telles que l’incorporation.
L’utilisation directe des API suivantes déclenche également des chargements :
Algorithm
L’algorithme suivant décrit comment le runtime charge un assembly managé.
Déterminez le
active
AssemblyLoadContext.- Pour une référence d’assembly statique,
active
AssemblyLoadContext est l’instance qui a chargé l’assembly de référence. - Les API préférées rendent l’élément
active
AssemblyLoadContext explicite. - Les autres API déduisent le
active
AssemblyLoadContext. Pour ces API, la propriété AssemblyLoadContext.CurrentContextualReflectionContext est utilisée. Si sa valeur estnull
, l’instance AssemblyLoadContext déduite est utilisée. - Consultez le tableau dans la section Quand les assemblys managés sont-ils chargés ?.
- Pour une référence d’assembly statique,
Pour les méthodes
Load-by-name
, leactive
AssemblyLoadContext charge l’assembly dans l’ordre de priorité suivant :- Vérifiez le
cache-by-name
. - Appelez la fonction AssemblyLoadContext.Load.
- Vérifiez le cache de l’instance AssemblyLoadContext.Default et exécutez la logique de détection par défaut de l’assembly managé. Si un assembly a récemment été chargé, une référence est ajoutée aux
cache-by-name
des instances AssemblyLoadContext.Default. - Déclenchez l’événement AssemblyLoadContext.Resolving pour l’assemblyLoadContext actif.
- Déclenchez l'événement AppDomain.AssemblyResolve.
- Vérifiez le
Pour les autres types de chargements,
active
AssemblyLoadContext charge l’assembly dans l’ordre de priorité suivant :- Vérifiez le
cache-by-name
. - Charger à partir du chemin d’accès spécifié ou de l’objet d’assembly brut. Si un assembly a récemment été chargé, une référence est ajoutée aux
active
AssemblyLoadContext des instancescache-by-name
.
- Vérifiez le
Dans tous les cas, si un assembly a récemment été chargé, l’événement AppDomain.AssemblyLoad est déclenché.