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 :

API Description Active AssemblyLoadContext
AssemblyLoadContext.LoadFromAssemblyName Load-by-name Instance
AssemblyLoadContext.LoadFromAssemblyPath
AssemblyLoadContext.LoadFromNativeImagePath
Chargez à partir du chemin d’accès. Instance
AssemblyLoadContext.LoadFromStream Chargez à partir de l’objet. Instance
Assembly.LoadFile Charger à partir d’un chemin d’accès dans une nouvelle instance AssemblyLoadContext Nouvelle instance AssemblyLoadContext.
Assembly.LoadFrom Chargez à partir du chemin d’accès dans l’instance AssemblyLoadContext.Default.
Ajoute un gestionnaire AppDomain.AssemblyResolve. Le gestionnaire charge les dépendances de l’assembly à partir de son répertoire.
Instance AssemblyLoadContext.Default.
Assembly.Load(AssemblyName)
Assembly.Load(String)
Assembly.LoadWithPartialName
Load-by-name. Déduit de l’appelant.
Préférez les méthodes AssemblyLoadContext.
Assembly.Load(Byte[])
Assembly.Load(Byte[], Byte[])
Chargez à partir d’un objet dans une nouvelle instance AssemblyLoadContext. Nouvelle instance AssemblyLoadContext.
Type.GetType(String)
Type.GetType(String, Boolean)
Type.GetType(String, Boolean, Boolean)
Load-by-name. Déduit de l’appelant.
Préférez les méthodes Type.GetType avec un argument assemblyResolver.
Assembly.GetType Si le type name décrit un type générique qualifié d’assembly, déclenchez un Load-by-name. Déduit de l’appelant.
Préférez utiliser Type.GetType pour les noms de types qualifiés d’assembly.
Activator.CreateInstance(String, String)
Activator.CreateInstance(String, String, Object[])
Activator.CreateInstance(String, String, Boolean, BindingFlags, Binder, Object[], CultureInfo, Object[])
Load-by-name. Déduit de l’appelant.
Préférez les méthodes Activator.CreateInstance prenant un argument Type.

Algorithm

L’algorithme suivant décrit comment le runtime charge un assembly managé.

  1. Déterminez le activeAssemblyLoadContext.

  2. Pour les méthodes Load-by-name, le activeAssemblyLoadContext charge l’assembly dans l’ordre de priorité suivant :

  3. Pour les autres types de chargements, activeAssemblyLoadContext 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 cache-by-name des instances activeAssemblyLoadContext.
  4. Dans tous les cas, si un assembly a récemment été chargé, l’événement AppDomain.AssemblyLoad est déclenché.