利用反射从程序集dll中动态调用方法(附demo下载)

在某些应用场景下我们需要动态调用某些程序集中的方法,例如某些大型产品中集成子产品、子项目或第三方产品的功能,有一种方式是通过数据持久化的形式来,数据持久化可能是用关系数据库或XML等存储程序集名称、命名空间、类名、方法名、参数类型及值等,这样通过反射结合业务逻辑就可以做出非常好的解耦的组件,这里暂时不考虑持久化和业务逻辑,只是单纯的引入一个demo来实现利用反射动态调用dll中的方法。主要步骤总结如下:

1、获取程序集的文件名或路径,加载程序集;

            Assembly assembly = null;
            string appPath = Assembly.GetExecutingAssembly().Location;
            appPath = appPath.Substring(0, appPath.LastIndexOf('\\') + 1);
            // 1、获取程序集的文件名或路径,加载程序集
            assembly = Assembly.LoadFrom(appPath + "FactRefect.dll");

2、获取程序集实例中具有指定名称的 System.Type 对象;

            Type type = null;
            // 2、获取程序集实例中具有指定名称的 System.Type 对象
            type = assembly.GetType("FactRefect.RefectionTest");
           

3、得到type的target类实例;

 Object obj = null;
            // 3、得到target类实例
            obj = type.InvokeMember(null, BindingFlags.DeclaredOnly |
                                    BindingFlags.Public | BindingFlags.NonPublic |
                                    BindingFlags.Instance | BindingFlags.CreateInstance,
                                    null, null, null);

4、调用type 类实例中的方法;

        // 4、先调用RefectionTest类中的Set方法,设置x和y值分别为1和2
            type.InvokeMember("Set", BindingFlags.DeclaredOnly |
                                            BindingFlags.Public | BindingFlags.NonPublic |
                                            BindingFlags.Instance | BindingFlags.InvokeMethod,
                                            null, obj, new object[] { 1, 2 });
            // 5、再调用RefectionTest类中的Show方法,来打印出x和y值
            type.InvokeMember("Show", BindingFlags.DeclaredOnly |
                                            BindingFlags.Public | BindingFlags.NonPublic |
                                            BindingFlags.Instance | BindingFlags.InvokeMethod,
                                            null, obj, null);

Demo源码下载:RefectionTest.zip

转载于:https://www.cnblogs.com/limengqiang/archive/2013/03/19/RefectTest.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值