usingMicrosoft.Extensions.DependencyInjection;usingMicrosoft.Extensions.DependencyModel;usingMicrosoft.Extensions.DependencyModel.Resolution;usingSystem;usingSystem.Collections.Concurrent;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Reflection;usingSystem.Runtime.Loader;usingZRB.Blog.Configurations;namespaceZRB.Blog.Injection
{public static classAssemblyLoader
{private static readonlyICompilationAssemblyResolver AssemblyResolver;private static readonly ConcurrentDictionaryDependencyDLL;staticAssemblyLoader()
{
AssemblyLoadContext.Default.Resolving+=Default_Resolving;
AssemblyResolver= newCompositeCompilationAssemblyResolver(newICompilationAssemblyResolver[]{newAppBaseCompilationAssemblyResolver(AppDomain.CurrentDomain.BaseDirectory),newReferenceAssemblyPathResolver(),newPackageCompilationAssemblyResolver()
});
DependencyDLL= new ConcurrentDictionary();
}private staticAssembly Default_Resolving(AssemblyLoadContext assemblyLoadContext, AssemblyName assemblyName)
{if(DependencyDLL.ContainsKey(assemblyName.Name))
{var compilationLibrary =DependencyDLL[assemblyName.Name];var assemblies = new List();if (AssemblyResolver.TryResolveAssemblyPaths(compilationLibrary, assemblies) && assemblies.Count > 0)
{var assembly = assemblyLoadContext.LoadFromAssemblyPath(assemblies[0]);
FindDependency(assembly);returnassembly;
}
}return null;
}public static Assembly GetAssembly(stringassemblyName)
{string assemblyFileName = AppDomain.CurrentDomain.BaseDirectory + assemblyName + ".dll";
Assembly assembly= AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(a => a.FullName?.Split(',')[0] == assemblyName) ??AssemblyLoadContext.Default.LoadFromAssemblyPath(assemblyFileName);
FindDependency(assembly);returnassembly;
}private static voidFindDependency(Assembly assembly)
{
DependencyContext dependencyContext=DependencyContext.Load(assembly);if(dependencyContext!= null)
{foreach (var compilationLibrary independencyContext.CompileLibraries)
{if (!DependencyDLL.ContainsKey(compilationLibrary.Name)&& !AppDomain.CurrentDomain.GetAssemblies().Any(a => a.FullName.Split(',')[0] ==compilationLibrary.Name))
{
RuntimeLibrary library= dependencyContext.RuntimeLibraries.FirstOrDefault(runtime => runtime.Name ==compilationLibrary.Name);var cb = newCompilationLibrary(
library.Type,
library.Name,
library.Version,
library.Hash,
library.RuntimeAssemblyGroups.SelectMany(g=>g.AssetPaths),
library.Dependencies,
library.Serviceable);
DependencyDLL[library.Name]=cb;
}
}
}
}
}
}