一、使用方法

  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. Solution -「CEOI 2017」「洛谷 P4654」Mousetrap

    \(\mathscr{Description}\)   Link.   在一个含 \(n\) 个结点的树形迷宫中,迷宫管理者菈米莉丝和一只老鼠博弈.老鼠初始时在结点 \(y\),有且仅有结点 \(x\ ...

  2. Solution -「POI 2011」「洛谷 P3527」MET-Meteors

    \(\mathcal{Description}\)   Link.   给定一个大小为 \(n\) 的环,每个结点有一个所属国家.\(k\) 次事件,每次对 \([l,r]\) 区间上的每个点点权加上 ...

  3. 【lwip】lwip源码基础

    目录 前言 概念&作用 网络接口 概念引入 总结 lwip netif 结构体 链接 字段分析 网卡链表 网络 IP 接收数据函数 发送数据函数 ARP 模块调用的发送函数 出口回调函数 用户 ...

  4. Spring Bean配置加载为BeanDefinition全过程(注解配置)

    生产中有很多形式的的配置方式,本文仅分析注解配置.对于其他形式的配置区别主观以为主要在配置文件的解析过程不同,不一一分析了.本文以利用Dubbo框架开发rpc服务端为例详细阐述配置类的解析.数据保存. ...

  5. 关于 share 音乐分享官方文档补充

    例子 音乐分享 /*--------微信朋友圈--------*/ [shareParams SSDKSetupWeChatParamsByText:@"内容" title:@&q ...

  6. mysql 事务 隔离性 锁

    1.四大特性 1.1 原子性(Atomicity) 一个事务是不可分割的最小工作单位.一个事务是不可分割的最小工作单位. 利用undo log保证原子性,undo log记录的是操作的反向语句,例如执 ...

  7. Devops 开发运维高级篇之微服务代码上传和代码检查

    Devops 开发运维高级篇之微服务代码上传和代码检查 微服务持续集成(1)-项目代码上传到Gitlab 微服务持续集成(2)-从Gitlab拉取项目源码 微服务持续集成(3)-提交到SonarQub ...

  8. 一、Java 特性和运行机制

    目录 Java 特性和优势 Java应用程序的运行机制 JVM.JRE和JDK Java 特性和优势 跨平台/可移植性 核心优势.比如:Java的int型永远是32位,C++(16,32). 安全性 ...

  9. 基于C#打造的OPCUA客户端应用

    OPC UA (Unified Architecture),是工业4.0的标准通信规范,大家现在都不陌生. 目前大部分工控行业的应用系统都逐渐的在向OPC UA靠拢,所以随着iot的发展,OPC UA ...

  10. [镜像转换] ova文件转换成raw文件, 导入到openstack

    ova转raw 使用工具: qemu-img.libguestfs-tools.libguestfs-winsupport # 从vmware导出ova文件, tar 解压导出来的ova文件 $ ta ...