Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Les assemblies managées sont trouvées et chargées par un algorithme qui comprend plusieurs étapes.
Tous les assemblages managés, à l'exception des assemblages satellites et des assemblages 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 l'environnement d'exécution et est influencé par des optimisations telles que l'inlining.
L’utilisation directe des API suivantes déclenche également des chargements :
| API (Interface de Programmation d'Applications) | Descriptif |
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 AssemblyLoadContext instance. |
| 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 AssemblyLoadContext méthodes. |
| Assembly.Load(Byte[]) Assembly.Load(Byte[], Byte[]) |
Chargez à partir d’un objet dans une nouvelle instance AssemblyLoadContext. | Nouvelle AssemblyLoadContext instance. |
| Type.GetType(String) Type.GetType(String, Boolean) Type.GetType(String, Boolean, Boolean) |
Load-by-name. |
Déduit de l’appelant. Préférez les Type.GetType méthodes avec un assemblyResolver argument. |
| 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 Activator.CreateInstance méthodes prenant un Type argument. |
Important
Contrairement à .NET Framework, le assemblyFile paramètre d’un Assembly.LoadFrom fichier est traité comme un chemin d’accès de fichier dans .NET, et non comme un URI. Dans .NET Framework, vous pouvez passer un URI de fichier (par exemple, file:///C:/path/to/assembly.dll) (par exemple, un construit à partir d’un Assembly.CodeBase) et l’assembly se charge correctement. Dans .NET, la assemblyFile valeur est passée à Path.GetFullPath, qui ne gère pas correctement les URI, de sorte que la charge échoue. Si vous disposez déjà d’une chaîne d’URI de fichier, commencez par créer une Uri instance et utilisez sa LocalPath propriété pour obtenir le chemin d’accès du fichier avant d’appeler Assembly.LoadFrom. Pour obtenir le chemin d’accès au fichier d’un assembly déjà chargé, utilisez Assembly.Location plutôt que CodeBase.
Algorithme
L’algorithme suivant décrit comment le runtime charge un assembly managé.
Déterminez le
activeAssemblyLoadContext.- Pour une référence d’assembly statique, il s’agit
activeAssemblyLoadContext de l’instance qui a chargé l’assembly de référence. - Les API préférées rendent l’élément
activeAssemblyLoadContext explicite. - D’autres API déduitnt le
activeAssemblyLoadContext. Pour ces API, la AssemblyLoadContext.CurrentContextualReflectionContext propriété est utilisée. Si sa valeur estnull, l’instance déduite AssemblyLoadContext 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, il s’agit
Pour les
Load-by-nameméthodes, leactiveAssemblyLoadContext 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 AssemblyLoadContext.Default des instances
cache-by-name. - 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, l’assembly
activeAssemblyLoadContext est chargé dans l’ordre de priorité suivant :- Vérifiez le
cache-by-name. - Si la
activeAssemblyLoadContext valeur est AssemblyLoadContext.Default, exécutez la logique de détection par défaut pour les assemblys managés. - 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
activede l'instance AssemblyLoadContextcache-by-name.
- Vérifiez le
Dans les deux cas, si un assembly est nouvellement chargé, l’événement AppDomain.AssemblyLoad est déclenché.