一、使用方法

  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());
    }
    }

最新文章

  1. 笔记--mysql rpm 安装
  2. touches, targetTouches, changedTouches 区别
  3. 时间工厂[XDU1013]
  4. Gentoo安装配置过程与总结
  5. VB-获取某字符在其中出现的次数
  6. 鼠标聚焦到Text输入框时,按回车键刷新页面原因及解决方法
  7. 201521123122 Java 第二周学习总结
  8. [图像类名词解释][ RGB YUV HSV相关解释说明]
  9. PHPMailer发送邮件失败:SMTP connect failed
  10. Spark Scheduler模块源码分析之TaskScheduler和SchedulerBackend
  11. OpenCV导向滤波(引导滤波)实现(Guided Filter)代码,以及使用颜色先验算法去雾
  12. Linux高级运维 第五章 Vim编辑器和恢复ext4下误删除的文件-Xmanager工具
  13. Unity录音
  14. 网络通信协议五之IP协议详解
  15. ubuntu opencv
  16. oracle_效率优化
  17. file-loader引起的html-webpack-plugin坑
  18. Exp3:MAL_免杀原理与实践
  19. K/V式枚举
  20. oracle数据库存储过程中NO_DATA_FOUND不起作用解决

热门文章

  1. .NET 7 预览版 1 发布
  2. pytest(11)-Allure生成测试报告(一)
  3. 【FAQ】接入HMS Core应用内支付服务过程中一些常见问题总结
  4. 浅谈C#字符串构建利器StringBuilder
  5. virtualenv 创建隔离工作环境
  6. 基于IPv6的RIPng路由协议测试——信而泰网络测试仪实操
  7. 【windows 操作系统】并发
  8. .NET NuGet整理
  9. 查看oracle归档日志路径
  10. Pandas:从CSV中读取一个含有datetime类型的DataFrame、单项时间数据获取