一、使用方法

  1. 查找DLL文件,

  2. 通过Reflection反射类库里的各种方法来操作dll文件

二、步骤

  • 加载DLL文件

      Assembly assembly1 = Assembly.Load("SqlServerDB");//方式一:这个DLL文件要在启动项目下
    string filePath = Environment.CurrentDirectory + "";
    Assembly assembly2 = Assembly.LoadFile(filePath + @"\SqlServerDB.dll");//方式二:完整路径
    Assembly assembly3 = Assembly.LoadFrom(filePath + @"\SqlServerDB.dll");//方式三:完整路径
    Assembly assembly4 = Assembly.LoadFrom(@"SqlServerDB.dll");//方式三:完整路径
  • 获取指定类型

    foreach (var item in assembly4.GetTypes())//查找所有的类型,就是有多少个类
    {
    Console.WriteLine(item.Name);
    }
  • 获取构造函数

      Type type = assembly4.GetType("SqlServerDB.ReflectionTest");//在ReflectionTest类中调用
    foreach (var ctor in type.GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public))
    {
    Console.WriteLine($"构造方法:{ctor.Name}");
    foreach (var param in ctor.GetParameters())
    {
    Console.WriteLine($"构造方法的参数:{param.ParameterType}");
    }
    }
    //【3】实例化
    //ReflectionTest reflectionTest = new ReflectionTest();//这种实例化是知道具体类型--静态 //object objTest = Activator.CreateInstance(type);//动态实例化--调用我们的构造方法
    object objTest1 = Activator.CreateInstance(type, new object[] { "string" });//动态实例化--调用我们的有参数构造方法 //调用私有构造函数
    //ReflectionTest reflectionTest = new ReflectionTest(); //普通调用
    object objTest2 = Activator.CreateInstance(type, true);
  • 调用非构造方法

    			  object objTest2 = Activator.CreateInstance(type, true);
    //调用普通方法
    ReflectionTest reflectionTest = objTest2 as ReflectionTest;//as转换的好处,它不报错,类型不对的话就返回null
    reflectionTest.Show1(); //调用私有方法
    var method = type.GetMethod("Show2", BindingFlags.Instance | BindingFlags.NonPublic);
    method.Invoke(objTest2, new object[] { });
  • 调用泛型方法

     			//泛型无参数
    var method3 = type.GetMethod("Show3");//查找指定方法
    var genericMethod = method3.MakeGenericMethod(new Type[] { typeof(int) });//指定泛型参数类型T
    genericMethod.Invoke(objTest2, new object[] { }); //泛型有参数
    var method4 = type.GetMethod("Show4");//查找指定方法
    var genericMethod4 = method4.MakeGenericMethod(new Type[] { typeof(string) });//指定泛型参数类型T
    genericMethod4.Invoke(objTest2, new object[] { 123, "泛型string参数" });
  • 反射测试类

    位于SqlServerDB.dll中的ReflectionTest.cs文件中

     /// <summary>
    /// 反射测试类
    /// </summary>
    public class ReflectionTest
    {
    //私有构造函数
    private ReflectionTest()
    {
    Console.WriteLine("这是私有无参数构造方法");
    } //普通构造函数
    //public ReflectionTest()
    //{
    // Console.WriteLine("这是无参数构造方法");
    //} public ReflectionTest(string name)
    {
    Console.WriteLine($"这是有参数构造方法+参数值是:{name}");
    } public void Show1()
    {
    Console.WriteLine("调用普通方法", this.GetType());
    } private void Show2()
    {
    Console.WriteLine("调用私有方法",this.GetType());
    } public void Show3<T>()
    {
    Console.WriteLine("调用无参数泛型方法", this.GetType());
    } public void Show4<T>(int id,string name)
    {
    Console.WriteLine($"调用有参数泛型方法,参数是{id},{name}", this.GetType());
    }
    }

反射操作dll类库之普通类和各种方法调用的更多相关文章

  1. Spring @Cacheable注解 && 事务@Transactional 在同一个类中的方法调用不生效

    @Cacheable 注解在对象内部调用不会生效 代码示例:ProductServiceImpl.java public List<ProductInfoVO> getProductLis ...

  2. 梳理:python—同一个类中的方法调用

    为什么突然在此提到这个梳理问题呢? 因为在自己实践综合练习学过的知识时,突然觉得有些知识点的运用总是不成功,于是翻过课本进行回顾,总是觉得是对的,可是当再进一步思考“既然是对的,为什么在程序中总是不成 ...

  3. Java中的静态方法和实例方法的调用的理解(不同的类下的方法调用)

    public class MethodCall { public static void main(String[] args) { Test.sayStatic(); Test test = new ...

  4. spring aop无法拦截类内部的方法调用

    1.概念 拦截器的实现原理就是动态代理,实现AOP机制.Spring 的代理实现有两种:一是基于 JDK Dynamic Proxy 技术而实现的:二是基于 CGLIB 技术而实现的.如果目标对象实现 ...

  5. java 主类的main方法调用其他方法

    方法1:A a=new test().new A(); 内部类对象通过外部类的实例对象调用其内部类构造方法产生,如下: public class test{ class A{ void fA(){ S ...

  6. 分析spring事务@Transactional注解在同一个类中的方法之间调用不生效的原因及解决方案

    问题: 在Spring管理的项目中,方法A使用了Transactional注解,试图实现事务性.但当同一个class中的方法B调用方法A时,会发现方法A中的异常不再导致回滚,也即事务失效了. 当这个方 ...

  7. C#创建dll类库

    类库让我们的代码可复用,我们只需要在类库中声明变量一次,就能在接下来的过程中无数次地使用,而无需在每次使用前都要声明它.这样一来,就节省了我们的内存空间.而想要在类库添加什么类,还需取决于类库要实现哪 ...

  8. dll的概念 dll导出变量 函数 类

    1. DLL的概念 DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数.变量或类.这些可以直接拿来使用. 静态链接库与动态链接库的区别:   (1)静态链接 ...

  9. 利用C#的反射机制动态调用DLL类库

    最近由于业务要求,需要动态调用DLL类库,所以研究了一下,感觉还好也不太难,今天就把自己理解的写了一个小例子(已经通过VS2005跑通),供大家一起研究和探讨,有理解不当的地方还请高手们多多指正,谢谢 ...

随机推荐

  1. MyBatis源码环境搭建

    之前研究mybatis都是参考前面学习的人的一些经验,并没有自己搭建源码环境进行.现在以mybatis3.4.6版本搭建,搭建过程中各种failed,下面大致记录环境搭建过程. 1.mybatis3. ...

  2. Docker 镜像 层结构理解

    镜像到底是什么.镜像的层结构又是什么 通过docker history命令进行分析,镜像是一种其他镜像+文件+命令的组合. 这些镜像的加载.文件导入创建.命令是存在顺序关系的,所以也引出了层的概念. ...

  3. SpringBoot实现QQ邮件发送

    建项目 创建一个SpringBoot项目 改pom,导入相关依赖 org.springframework.boot spring-boot-starter-parent 2.2.2.RELEASE & ...

  4. 每日一题:codeforces题解

    题目 B. Peculiar Movie Preferences time limit per test 2 seconds memory limit per test 512 megabytes i ...

  5. Python中模块、类、函数、实例调用案例

    19 a = '我是模块中的变量a' 20 21 def hi(): 22 a = '我是函数里的变量a' 23 print('函数"hi"已经运行!') 24 25 class ...

  6. Eclipse插件开发demo

    一.安装 1. 下载安装JDk 2. 下载安装PDE(Plugin-in Development Environment) 访问eclipse官网,点击Download,选择Download Pack ...

  7. [自动化]ssh自动化免密访问配置

    ssh简介 SSH(Secure Shell)是一种通信加密协议,加密算法包括:RSA.DSA等 RSA:非对称加密算法,其安全性基于极其困难的大整数的分解(两个素数的乘积): DSA:也是非对称加密 ...

  8. CobaltStrike逆向学习系列(3):Beacon C2Profile 解析

    这是[信安成长计划]的第 3 篇文章 关注微信公众号[信安成长计划] 0x00 目录 0x01 Controller 端分析 0x02 Beacon 端分析 0x03 展示图 在上一篇文章中完成了 S ...

  9. 【C# IO 操作】 Path 路径类 |Directory类 |DirectoryInfo 类|DriveInfo类|File类|FileInfo类|FileStream类

    Directory类 Directory类 是一个静态类,常用的地方为创建目录和目录管理. 一下来看看它提供的操作. 1.CreateDirectory 根据指定路径创建目录.有重载,允许一次过创建多 ...

  10. 小程序根据ID跳转到不同的分页

    想实现效果: 点击后跳转 wxml: <view class="fiveson">         <view class="fiveson-son&q ...