- 通过反射的方法调用外部DLL文件的函数(要事先知道DLL内的结构:命名空间、函数名称、函数参数类型等)
// 依赖
using System.Reflection;
代码
//加载Dll文件
Assembly assembly = Assembly.LoadFile(@"dll的路径");
//获取类型,参数(命名空间.类名)
Type type = assembly.GetType("namespace.ClassName");
//创建该对象的实例,object类型,参数(命名空间.类)
object instance = assembly.CreateInstance("namespace.ClassName");
//设置要调用方法中的参数类型,Type[]类型,如果有多个参数课追加
//假设要调用的方法只有一个String类型的参数
Type[] paramsType = new Type[1];
paramsType[0] = Type.GetType("System.String");
//设置要调用方法方法中的参数值,同上可追加
Object[] paramsObj = new Object[1];
paramsObj[0] = "参数值";
//执行ShowPara方法,并接收返回值
object returnValue = type.GetMethod("ShowPara", paramsType).Invoke(instance, paramsObj);
对于带参数的且没有无参构造函数的,使用上述方法构造实例会出错,可以使用System.Activator的CreateInstance(Type, Object)来构造实例:
//获取类型,参数(命名空间.类)
Type type = assembly.GetType("namespace.ClassName");
//构造函数参数列表
object[] parames = new Object[]{para1,para2,para3...};
//创建该对象的实例,object类型,参数(Type, Object)
object instance = Activator.CreateInstance(type, parames);
静态方法的调用: 在GetMethod()时添加参数即可。
BindingFlags.NonPublic | BindingFlags.Static
eg:
object returnValue = type.GetMethod("FunName", BindingFlags.NonPublic | BindingFlags.Static).Invoke(instance, null);
- 通过反射的方法查看外部DLL文件的类成员
FieldInfo[] allFields = type.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
Dictionary<string, object> allFieldsMap = new Dictionary<string, object>();
foreach (FieldInfo f in allFields)1
{
allFieldsMap.Add(f.Name, f.GetValue(instance));
}