netcore更新dll要停止_net core手动加载dll,无法自动加载其依赖项

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;

}

}

}

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值