var domain = new AssemblyLoadContext("helloworld", true); domain.LoadFromAssemblyPath(Path.Combine(AppContext.BaseDirectory, "LibAdd.dll")); domain.LoadFromAssemblyPath(Path.Combine(AppContext.BaseDirectory, "LibSub.dll"));
解决依赖
如果加载的dll引用了其它dll,那么这将解决依赖问题。
1 2 3 4 5 6
domain.Resolving += (context,arg2)=> { var assembly = domain.LoadFromAssemblyPath(Path.Combine(AppContext.BaseDirectory, arg2.Name + ".dll")); if (assembly != null) return assembly; thrownew NotImplementedException(); };
使用反射调用静态方法
1 2 3 4 5 6
var assembly2 = domain.Assemblies.First(); //通过反射调用静态方法 Type typetmp = assembly2.GetType("LibAdd.Calc"); MethodInfo method = typetmp.GetMethod("Test"); object test = method.Invoke(null, newobject[] {3,4}); Console.WriteLine(test);
使用反射调用非静态方法
1 2 3 4 5
//通过反射调用非静态方法 var handle = assembly2.CreateInstance("LibAdd.Calc"); MethodInfo method2 = typetmp.GetMethod("Run"); test = method2.Invoke(handle, newobject[] { 3, 4 }); Console.WriteLine(test);
通过接口约束调用通用方法(推荐)
1 2 3 4 5 6 7 8
//通过接口约束调用通用方法 foreach (var assembly in domain.Assemblies) { var type = assembly.ExportedTypes.Where(x => x.GetInterfaces().Contains(typeof(ICalc))).FirstOrDefault(); var objHandle = Activator.CreateInstance(type) as ICalc; int res = objHandle.Run(1, 2); Console.WriteLine(res); }
foreach (var context in AssemblyLoadContext.All) { Console.WriteLine("当前存在的程序集:" + context.Name); }
使用简单的封装来调用(推荐)
1 2 3 4 5 6 7
var dh = new AssemblyHelper(AppContext.BaseDirectory, "LibAdd.dll", false); Assembly outerAsm = dh.outerAsm; var type3 = outerAsm.ExportedTypes.Where(x => x.GetInterfaces().Contains(typeof(ICalc))).FirstOrDefault(); var objHandle2 = Activator.CreateInstance(type3) as ICalc; int res2 = objHandle2.Run(1, 2); Console.WriteLine(res2); dh.Unload();
staticvoidMain(string[] args) { var domain = new AssemblyLoadContext("helloworld", true); foreach (var context in AssemblyLoadContext.All) { Console.WriteLine("当前存在的程序集:" + context.Name); } domain.LoadFromAssemblyPath(Path.Combine(AppContext.BaseDirectory, "LibAdd.dll")); domain.LoadFromAssemblyPath(Path.Combine(AppContext.BaseDirectory, "LibSub.dll")); //解决依赖 domain.Resolving += (context,arg2)=> { var assembly = domain.LoadFromAssemblyPath(Path.Combine(AppContext.BaseDirectory, arg2.Name + ".dll")); if (assembly != null) return assembly; thrownew NotImplementedException(); };
//通过接口约束调用通用方法 foreach (var assembly in domain.Assemblies) { var type = assembly.ExportedTypes.Where(x => x.GetInterfaces().Contains(typeof(ICalc))).FirstOrDefault(); var objHandle = Activator.CreateInstance(type) as ICalc; int res = objHandle.Run(1, 2); Console.WriteLine(res); }
var assembly2 = domain.Assemblies.First();
//通过反射调用静态方法 Type typetmp = assembly2.GetType("LibAdd.Calc"); MethodInfo method = typetmp.GetMethod("Test"); object test = method.Invoke(null, newobject[] {3,4}); Console.WriteLine(test);
//通过反射调用非静态方法 var handle = assembly2.CreateInstance("LibAdd.Calc"); MethodInfo method2 = typetmp.GetMethod("Run"); test = method2.Invoke(handle, newobject[] { 3, 4 }); Console.WriteLine(test);