动态加载dll,主要是为了扩展功能,增强灵活性而实现的。主要通过xml配置,来获取所有要动态加载的dll,然后通过反射机制来调用dll中的类及其方法。
研究了一天,小有所得,写了一个简单的动态加载dll的通用模块,拿出来与大家分享一下:
using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Reflection;using System.Text;using System.Threading.Tasks;namespace DynamicLoadDLL{ ///这个是加载dll的,然后返回一个Assembly类型的一个反射值,如果该dll中有多个命名空间和类的话,就只用一个 Assembly类型的一个反射值即可以完成调用,否则每次生成一个类,都需要反射一次。IO操作相对而言是比较耗费CPU,影响效率的。/// 动态加载dll /// public class LoadDLL { private Assembly ass = null; ////// 加载dll /// /// dll文件路径 public LoadDLL(string dllPath) { this.ass = Assembly.LoadFrom(dllPath); //利用dll的路径加载(fullname) } ////// 返回反射的dll /// ///public Assembly GetAssembly() { return this.ass; } /// /// 获取所有类名 /// ///public Type[] GetClass() { return ass.GetTypes(); } /// /// 获取程序集下的所有文件名 /// ///public Module[] GetModules() { return ass.GetModules(); } /// /// 获取程序集清单文件表中的文件 /// ///public FileStream[] GetFiles() { return ass.GetFiles(); } }}
using System;using System.Collections.Generic;using System.Linq;using System.Reflection;using System.Text;using System.Threading.Tasks;namespace DynamicLoadDLL{ ///上面这个类根据dll反射值,命名空间和类名,反射出一个具体的类,还提供了属性和方法的调用方法。很方便。/// 加载类 /// public class LoadClass { private static LoadClass dlc = null; private Type type; private object obj = null; //实例 ////// 加载dll /// /// dll引用 /// 类的命名空间 /// 类名称 private LoadClass(Assembly ass, string nameSpace, string classPath) { //加载dll后,需要使用dll中某类. type = ass.GetType(nameSpace + "." + classPath); //利用类型的命名空间和名称获得类型 //需要实例化类型,才可以使用,参数可以人为的指定,也可以无参数,静态实例可以省略 obj = Activator.CreateInstance(type); //利用指定的参数实例话类型 } ////// 加载dll /// /// dll引用 /// 类的命名空间 /// 类名称 public static LoadClass GetInstance(Assembly ass, string nameSpace, string classPath) { if (dlc == null) { dlc = new LoadClass(ass, nameSpace, classPath); } return dlc; } ////// 获取属性集 /// ///返回属性值 public PropertyInfo[] GetAttrs() { //调用类型中的某个属性: PropertyInfo[] prop = type.GetProperties(); //通过属性名称获得属性 //返回属性集 return prop; } public MethodInfo[] GetMethods() { //调用类型中的方法: MethodInfo[] method = type.GetMethods(BindingFlags.NonPublic); //获得方法集 //返回方法集 return method; } ////// 获取属性值 /// /// 属性名称 ///返回属性值 public object GetAttrValue(string attrName) { //调用类型中的某个属性: PropertyInfo prop = type.GetProperty(attrName); //通过属性名称获得属性 //返回属性值 return prop.GetValue(obj); } ////// 设置属性值 /// /// 属性名称 ///返回属性值 public void SetAttrValue(string attrName, string attrValue) { //调用类型中的某个属性: PropertyInfo prop = type.GetProperty(attrName); //通过属性名称获得属性 //返回属性值 prop.SetValue(obj, attrValue); } ////// 执行类方法 /// /// 方法名称 /// 参数 /// 参数类型 ///public object GetMethod(string methodName, object[] paras,Type[] types) { //调用类型中的某个方法: MethodInfo method = type.GetMethod(methodName,types); //通过方法名称获得方法 //执行方法 return method.Invoke(obj, paras); } }}
这些是我在研究插件编程时,顺带研究的,不太深入,但希望对你能有所帮助。
版权声明:本文为博主原创文章,未经博主允许不得转载。