C#通过反射调用DLL内部函数

  • 通过反射的方法调用外部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));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值