Sondage par défaut

L’instance AssemblyLoadContext.Default est chargée de localiser les dépendances d’un assembly. Cet article décrit la logique de sondage de l’instance AssemblyLoadContext.Default.

Propriétés de sondage configurées de l’hôte

Lorsque le runtime est démarré, l’hôte d’exécution fournit un ensemble de propriétés de sondage nommées qui configurent AssemblyLoadContext.Default les chemins de sondage.

Chaque propriété de sondage est facultative. Si elle est présente, chaque propriété est une valeur de chaîne qui contient une liste délimitée de chemins d’accès absolus. Le délimiteur est « ; » sur Windows et « : » sur toutes les autres plateformes.

Nom de la propriété Description
TRUSTED_PLATFORM_ASSEMBLIES Liste des chemins d’accès aux fichiers d’assembly d’application et de plateforme.
PLATFORM_RESOURCE_ROOTS Liste des chemins d’accès au répertoire pour rechercher des assemblys de ressources satellites.
NATIVE_DLL_SEARCH_DIRECTORIES Liste des chemins d’accès au répertoire pour rechercher des bibliothèques non managées (natives).
APP_PATHS Liste des chemins d’accès pour rechercher des assemblys managés.

Comment les propriétés sont-elles remplies ?

Il existe deux scénarios principaux pour remplir les propriétés selon que le fichier <myapp>.deps.json existe ou non.

  • Lorsque le fichier *.deps.json est présent, il est analysé pour remplir les propriétés de sondage.
  • Lorsque le fichier *.deps.json n’est pas présent, on suppose que le répertoire de l’application contient toutes les dépendances. Le contenu du répertoire est utilisé pour remplir les propriétés de sondage.

En outre, les fichiers *.deps.json pour toutes les infrastructures référencées sont analysés de la même façon.

La variable d’environnement DOTNET_ADDITIONAL_DEPS peut être utilisée pour ajouter des dépendances supplémentaires. dotnet.exe contient également un paramètre facultatif --additional-deps pour définir cette valeur au démarrage de l’application.

La propriété APP_PATHS n’est pas renseignée par défaut et est omise de la plupart des applications.

La liste de tous les fichiers *.deps.json utilisés par l’application est accessible via System.AppContext.GetData("APP_CONTEXT_DEPS_FILES").

Comment faire pour voir les propriétés de sondage à partir du code managé ?

Chaque propriété est disponible en appelant la fonction AppContext.GetData(String) avec le nom de propriété à partir du tableau ci-dessus.

Comment faire pour déboguer la construction des propriétés de sondage ?

L’hôte du runtime .NET Core génère des messages de suivi utiles lorsque certaines variables d’environnement sont activées :

Variable d’environnement Description
COREHOST_TRACE=1 Active le suivi.
COREHOST_TRACEFILE=<path> Effectue le suivi vers un chemin d’accès de fichier plutôt que vers le stderr par défaut.
COREHOST_TRACE_VERBOSITY Définit la verbosité de 1 (la plus basse) à 4 (la plus élevée).

Sondage par défaut de l’assembly managé

Lors d’un sondage pour trouver un assembly managé, le AssemblyLoadContext.Default examine dans l’ordre :

  • Fichiers correspondant à AssemblyName.Name dans TRUSTED_PLATFORM_ASSEMBLIES (après suppression des extensions de fichier).
  • Fichiers d’assembly dans APP_PATHS avec des extensions de fichier courantes.

Sondage d’assembly satellite (ressource)

Pour rechercher un assembly satellite pour une culture spécifique, construisez un ensemble de chemins de fichiers.

Pour chaque chemin d’accès dans PLATFORM_RESOURCE_ROOTS , puis APP_PATHS, ajoutez la chaîne CultureInfo.Name, un séparateur de répertoires, la chaîne AssemblyName.Name et l’extension « .dll ».

S’il existe un fichier correspondant, essayez de le charger et de le retourner.

Détection de bibliothèque non managée (native)

L’algorithme de sondage de bibliothèque non managé du runtime est identique sur toutes les plateformes. Toutefois, étant donné que la charge réelle de la bibliothèque non managée est effectuée par la plateforme sous-jacente, le comportement observé peut être légèrement différent.

  1. Vérifiez si le nom de bibliothèque fourni représente un chemin absolu ou relatif.

  2. Si le nom représente un chemin absolu, utilisez le nom directement pour toutes les opérations suivantes. Sinon, utilisez le nom et créez des combinaisons définies par la plateforme à prendre en compte. Les combinaisons se composent de préfixes spécifiques à la plateforme (par exemple, lib) et/ou de suffixes (par exemple, .dll, .dylib et .so). Cette liste n’est pas exhaustive et ne représente pas l’effort exact effectué sur chaque plateforme. Il s’agit simplement d’un exemple de ce qui est considéré. Pour plus d’informations, voir le chargement des bibliothèques natives.

  3. Le nom et, si le chemin d’accès est relatif, chaque combinaison, est ensuite utilisée dans les étapes suivantes. La première tentative de chargement réussie retourne immédiatement le descripteur à la bibliothèque chargée.

    • Ajoutez-le à chaque chemin fourni dans la propriété NATIVE_DLL_SEARCH_DIRECTORIES et essayez de charger.

    • Si DefaultDllImportSearchPathsAttribute n’est pas défini sur l’assembly appelant ou p/invoke est défini et inclut DllImportSearchPath.AssemblyDirectory, ajoutez le nom ou la combinaison au répertoire de l’assembly appelant et essayez de charger.

    • Utilisez-la directement pour charger la bibliothèque.

  4. Indique que le chargement de la bibliothèque a échoué.