具体实现参考:
C# 动态加载DLL通过反射调用参数、方法、窗体_c#反射加载dll并传入参数-CSDN博客
C#进阶学习--反射(Reflection) - 知乎
走进C#反射机制 - 知乎
1.使用过程
//创建数据集
Assembly outerAsm = Assembly.LoadFile("D:/your.dll");//获取调用类型声明,要把命名空间带上
Type typeClass = outerAsm.GetType("namespace1.classNameA");//获取静态方法声明
MethodInfo methodStatic = typeClass1.GetMethod("staticFunc");//调用无参静态方法
object methoVal = methodStatic.Invoke(null, null);//创建实体,有参构造
object obj1 = Activator.CreateInstance(typeClass, new object[]{ para1,para2,...,paraN });//创建实体,无参构造
object obj2 = Activator.CreateInstance(typeClass, null });//获取非静态方法声明
MethodInfo methodGetInit = typeProduct.GetMethod("nonStaticFunc");//调用无参非静态方法
methodGetInit.Invoke(obj1 , null);//获取名为Property1的访问器
PropertyInfo propertyInfo = typeProduct.GetProperty("Property1");声明//获取product中名为Property1的访问器的值
object obj1 = propertyInfo.GetValue(product);
2.loadfrom、loadfile
参考:Assembly.LoadFile 方法 (System.Reflection) | Microsoft Learn
1)loadfrom
加载程序集的时候会连带性的加载,会连带把该文件所依赖的dll也加载
2)loadfile
仅加载一个文件,不会连带把该文件所依赖的dll也加载
3.其他补充
1)当前,在一个AppDomain中只能加载dll,不能卸载,因此在一个AppDomain中不能有同名的dll程序集
2)一个线程属于一个AppDoMain
参考:C# AppDomain 详解
3)AssemblyResolve
AssemblyResolve一般配合load方法使用,在load方法找不到程序集的时候,会调用AssemblyResolve解决冲突
AppDomain.CurrentDomain.AssemblyResolve -= OnAssemblyResolve;
List<string> Searchs = new List<string>() {"path1","path2" };
Assembly OnAssemblyResolve(object sender, ResolveEventArgs args)
{var assemblyName = new AssemblyName(args.Name);foreach(var item in Searchs){var file = string.Format("{0}.dll", System.IO.Path.Combine(item, assemblyName.Name));if (File.Exists(file)){return Assembly.LoadFile(file);}}return args.RequestingAssembly;
}
4)常见的冲突
要动态加载的dll跟输出目录中的dll冲突了,尤其是调用loadfrom的时候,其所依赖的dll一般会从输出目录中获取,但是输出目录中的dll并不是你想要的依赖版本,这时候就会冲突