public DependencyContext Merge(DependencyContext other) { if (other == null) { throw new ArgumentNullException(nameof(other)); } return(new DependencyContext( Target, CompilationOptions, CompileLibraries.Union(other.CompileLibraries, new LibraryMergeEqualityComparer <CompilationLibrary>()), RuntimeLibraries.Union(other.RuntimeLibraries, new LibraryMergeEqualityComparer <RuntimeLibrary>()), RuntimeGraph.Union(other.RuntimeGraph) )); }
//private Assembly AssemblyResolving(AssemblyLoadContext arg1, AssemblyName arg2) //{ // if (arg2.FullName == CurrentAssembly.FullName) // { // return CurrentAssembly; // } // var deps = DependencyContext.Default; // if (deps.CompileLibraries.Any(d => d.Name == arg2.Name)) // { // return Assembly.Load(arg2); // } // foreach (var item in DependencyAssemblies) // { // if (item.FullName == arg2.FullName) // { // return item; // } // } // return null; //} private void ResolveDenpendency(Assembly assembly) { string currentName = assembly.GetName().Name; if (CompileLibraries == null) { CompileLibraries = new HashSet <string>(); foreach (var item in DependencyContext.Default.CompileLibraries) { if (!CompileLibraries.Contains(item.Name)) { CompileLibraries.Add(item.Name); } } } List <CompilationLibrary> dependencyCompilationLibrary = DependencyContext.Load(assembly) .CompileLibraries.Where(de => PluginInfos.All(m => m.Name != de.Name) && de.Name != currentName && !CompileLibraries.Contains(de.Name)) .ToList(); if (LoadedAssemblies == null) { LoadedAssemblies = AppDomain.CurrentDomain.GetAssemblies().ToDictionary(m => m.GetName().Name); } dependencyCompilationLibrary.Each(libaray => { foreach (var item in libaray.ResolveReferencePaths(new DependencyAssemblyResolver(Path.GetDirectoryName(assembly.Location)))) { string assemblyName = AssemblyName.GetAssemblyName(item).Name; if (!LoadedAssemblies.ContainsKey(assemblyName)) { Assembly assemblyDep = AssemblyLoadContext.Default.LoadFromAssemblyPath(item); DependencyAssemblies.Add(assemblyDep); LoadedAssemblies.Add(assemblyName, assemblyDep); } } }); PluginDescriptor plugin = null; foreach (var typeInfo in assembly.DefinedTypes) { if (typeInfo.IsAbstract || typeInfo.IsInterface) { continue; } if (PluginTypeInfo.IsAssignableFrom(typeInfo)) { plugin = new PluginDescriptor { PluginType = typeInfo.AsType(), Assembly = assembly, Dependency = dependencyCompilationLibrary, CurrentPluginPath = CurrentPath }; } } if (plugin != null) { PluginActivtor.LoadedPlugins.Add(plugin); } }