Assemblage Chargement dans .NET Core

Utilisation de VS2017 RC, .NET Core

J’essaye de charger un assemblage à partir d’un fichier. Les dépendances de cet assemblage sont dans le même dossier.

J’utilise AssemblyLoadContext.Default.LoadFromAssemblyPath .

Je réalise que LoadFromAssemblyPath charge exclusivement l’assembly demandé, en ignorant ses dépendances. toute tentative d’itération à travers les types d’assembly échoue avec une System.Reflection.ReflectionTypeLoadException .

LoaderExceptions contient une liste de System.IO.FileNotFoundException .

Je suis curieux de savoir pourquoi, étant donné que tous les fichiers requirejs sont dans le même dossier.

J’ai également essayé de charger tous les fichiers * .dll dans un dossier, mais certains échouent de manière surprenante avec une System.IO.FileLoadException .

Qu’est-ce que je fais mal?

Edit: je ne voudrais pas compter sur le fichier .deps (ce qui exclut donc DependencyContext). C’est possible?

Ce qui fonctionne pour moi, c’est d’enregistrer un descripteur avec l’événement Resolving et de charger les assemblys requirejs à la demande lorsque LoadFromAssemblyPath a besoin de dépendances. Sachez que ceci est ma solution après des heures d’essais et d’erreur, ce n’est donc peut-être pas la solution idéale. Cela fonctionne pour moi maintenant cependant. Voici mon code:

  AssemblyLoadContext.Default.Resolving += (context, name) => { // avoid loading *.resources dlls, because of: https://github.com/dotnet/coreclr/issues/8416 if (name.Name.EndsWith("resources")) { return null; } var dependencies = DependencyContext.Default.RuntimeLibraries; foreach (var library in dependencies) { if (IsCandidateLibrary(library, name)) { return context.LoadFromAssemblyName(new AssemblyName(library.Name)); } } var foundDlls = Directory.GetFileSystemEnsortinges(new FileInfo().FullName, name.Name + ".dll", SearchOption.AllDirectories); if (foundDlls.Any()) { return context.LoadFromAssemblyPath(foundDlls[0]); } return context.LoadFromAssemblyName(name); }; } private static bool IsCandidateLibrary(RuntimeLibrary library, AssemblyName assemblyName) { return (library.Name == (assemblyName.Name)) || (library.Dependencies.Any(d => d.Name.StartsWith(assemblyName.Name))); } 

Le bit IsCandidateLibrary () provient de là: http ://www.michael-‘llan.net/replacing-appdomain-in-dotnet-core/

Je pense que vous pouvez omettre ceci et toute la partie DependencyContext, mais cela agit comme un cache et évite de recharger les mêmes assemblys, encore et encore. Alors je l’ai gardé.