一、使用方法

  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. 4、前端--浮动、定位、是否脱离文档流、溢出属性、z-index、透明度、JavaScript简介

    浮动 # ps:html代码时没有缩进一说的 全部写在一行也可以 """浮动主要就是用于页面布局的!!!""" # 浮动带来的负面影响 &q ...

  2. Linux性能优化之内存性能统计信息

    关于内存的概念及其原理在任何一本介绍操作系统的书本中都可以查阅到. 理论放一遍,在Linux操作系统中如何查看系统内存使用情况呢?看看内存统计信息有哪些维度. 一.内存使用量 详细使用方法,man f ...

  3. Mybatis的介绍和基本使用

    巨人的肩膀 Mybatis的介绍和基本使用(1) (qq.com) Mybatis SQL映射文件详解(2) (qq.com)

  4. Python中random模块的用法案例

    1 import random # 调用random模块 2 3 a = random.random() # 随机从0-1之间抽取一个小数 4 print(a) 5 6 a = random.rand ...

  5. 网络测试仪实操手册 RENIX 机框管理

    本文主要阐述信而泰BIGTAO系列 网络测试仪器机框相关操作方法.文章分为机框添加.机框删除.机框重启.机框关机四部分. 第一部分:机框添加 1.添加过程 1.1打开软件 1.2添加端口 1.3输入I ...

  6. python语法:注释

    Python语法:注释  python语言中的注释是来帮助程序员理解并读懂代码内容的文字.当然,注释不仅在python语言中是这个作用,在其他语言中也几乎一样. python注释的生成方式  所有演示 ...

  7. shell脚本创建身份证号

    --作者:飞翔的小胖猪 --创建时间:2021年5月16日 --修改时间:2021年5月16日 说明 运行脚本,用户手动输入信息生成身份证号.该程序的核心在于函数模块化及select的使用. 注意:该 ...

  8. Java:List(一)——概述

    说明 在集合类中,List是最基础的一种集合--有序List. List的行为和数组几乎相同:List内部按照放入元素先后顺序存放,每个元素都可以通过索引确定自己的位置,List的索引和数组相同,都是 ...

  9. LeetCode-023-合并K个升序链表

    合并K个升序链表 题目描述:给你一个链表数组,每个链表都已经按升序排列. 请你将所有链表合并到一个升序链表中,返回合并后的链表. 示例说明请见LeetCode官网. 来源:力扣(LeetCode) 链 ...

  10. Win10系统设置开机自启动

    有时候,我们想设置某些软件开机时自动启动,操作步骤如下: 1. win+R 同时按住键盘上的win和R键打开运行窗口 2. shell:startup 输入shell:startup后回车 3. 添加 ...