C#通过反射加载外部程序集(dll库文件)

news/2024/5/19 2:44:02 标签: c#, 反射

C#通过反射加载外部程序集(dll库文件)

  本文章使用了一个C#通过反射加载一个类库的dll文件,获取库文件中的公共成员,执行这些变量
反射基础整理传送门


说明:
这个dll文件和我们的反射不在同一个程序集中
在这里插入图片描述

测试代码
将这个脚本类库打包成dll库文件

namespace 程序集
{
    public enum E_Type {
        Cat,
        Dog
    }
    class TestClass
    {
        public int id = 01;
        public string strId = "零零";

        #region 构造方法
        public TestClass() { }

        public TestClass(int id) {
            this.id = id;
        }

        public TestClass(int id,string str):this(id)
        {
            this.strId = str;
        }
        #endregion

        //输出动物叫
        public string AniWow(E_Type type)
        {
            string wow = "";
            switch (type)
            {
                case E_Type.Cat:
                    wow = "喵喵";
                    break;
                case E_Type.Dog:
                    wow = "狗狗";
                    break;
                default:
                    break;
            }

            return wow;
        }
    }
}

通过反射获取
这里代码注释说的很明白,不再细说

class Program
    {
        static void Main(string[] args)
        {
            //1.加载程序集
            Assembly assembly = Assembly.LoadFile(@"C:\Users\Administrator\source\repos\CSharp反射\程序集\bin\Debug\程序集.dll");
            //获取程序集下所有公共成员(类 枚举 结构体 )等等
            Type[] types = assembly.GetTypes();
        	//获取程序集下的枚举
            Type e_type = assembly.GetType("程序集.E_Type");    
            //获取具体的枚举变量就跟获取公共变量一样
            FieldInfo Info_Cat = e_type.GetField("Cat");
            Type test = assembly.GetType("程序集.TestClass");
            //实例化一个对象
            object obj = Activator.CreateInstance(test,1);
            //获取TestClass中的方法
            MethodInfo mInfo = test.GetMethod("AniWow");
            //执行方法 传入一个对象,如果是静态方法第一个参数为null几个,用object数组来传递对应参数
            object o= mInfo.Invoke(obj, new object[] {Enum.Parse(e_type,"Dog") });

            Console.WriteLine(o);
            //当我们不知道程序集中有什么,我们可以通过相关API打印获取
            //FieldInfo[] infos = e_type.GetFields();
            //for (int i = 0; i < infos.Length; i++)
            //{
            //    Console.WriteLine(infos[i]);
            //}
            Console.ReadKey();
        }
    }

到此我们可以正确的调用库文件中的AniWow()的方法了
在这里插入图片描述


在我们使用其它程序集中的成员变量,我们可能不知道里边都有什么,我们可以通过Type中的方法,获取这些公共的成员变量。

Type[] types = assembly.GetTypes();打印数组中的元素:
在这里插入图片描述

总结:

加载程序集的一般步骤:

  1. 首先使用Assembly.LoadFile()或者Assembly.LoadForm()加载我们所需加载的程序集
  2. 然后再获取程序集中的公共的类,因为不是一个程序集,这里传入的参数一定是带有命名空间的,否则获取不到 例如:System.Int32
    3.再通过基本的API去获取我们想要获取的内容,然后去操作它们。

http://www.niftyadmin.cn/n/884199.html

相关文章

图片批量重命名(python实现)

自己在采集数据时&#xff0c;有时候的数据命名方式并不满足一些开源程序的条件&#xff0c;如果我们可以自己随意去改变图像的命名&#xff0c;问题 就变得很容易解决&#xff1b; 一、代码 import os path "/media/hltt3838/DATA/dida_data/20210421_camera_IMU/data…

Unity场景异步加载遇到的问题(进度条)

项目场景&#xff1a; 以前做的项目&#xff0c;突然甲方提供了较多的数据&#xff0c;测试加载场景中有点卡顿&#xff0c;改为一个异步加载场景用于过渡。避免太生硬的加载等待。 问题描述&#xff1a; 实现了场景的异步加载后&#xff0c;我一直觉得我这个加载有问题&#…

Ubuntu18.04 python2.7 升级python3.6,并切换版本

1. 在 终端ternimal输入命令 sudo apt-get install python3 //安装python3 安装完成之后&#xff0c;你在终端中输入python&#xff0c;输出的信息里面会提示是2.7版本的&#xff0c;也就是说默认打开的并不是刚才安装好的3.6&#xff0c;所以还需要…

C#中构造函数在继承关系中的规则

C#构造函数 说起构造函数&#xff0c;我们都知道是在实例化对象时&#xff0c;用于做一些初始化的操作&#xff0c;今天总结的是&#xff0c;在继承关系下的构造函数的执行关系&#xff0c;时间太长感觉拿捏不准了&#xff0c;好记性不如烂笔头,直接开始。 1.如果当前类存在继承…

Git学习 二、远程仓库

上一讲中https://blog.csdn.net/hltt3838/article/details/115253621&#xff0c; 我们已经掌握了如何在Git仓库里对一个文件进行时光穿梭&#xff0c;你再也不用担心文件备份或者丢失的问题了。 世界上有个叫GitHub的神奇的网站&#xff0c;从名字就可以看出&#xff0c;这个网…

Unity中使用MVC开发UI

MVC一、什么是MVC二、MVC小案例ModelViewController启动脚本三、小小小总结一、什么是MVC 说起MVC&#xff0c;可能都知道是Model--View--Controller,但是真要通透理解它的思想&#xff0c;还真是不容易。   何谓MVC呢&#xff1f;MVC开始是存在于桌面程序中的&#xff0c;M是…

Kdevelop 的 git进行版本控制

一、菜单栏 project—>从模板新建—>Stardard–>Terminal–>CMake C —>next—>选择version control system—>git—>finish 此时在工程文件夹里&#xff0c;可以看到一个 .git文件 表示新建了一个git版本控制工程。 git版本控制工程 注意啦 : 我们…

Unity中实现一个对象池

Unity 中实现对象池一、对象池流程图二、案例三、如何使用一、对象池流程图 总池子   将总池子作为单例模式供外部调用&#xff0c;管理具体的子池子。 子池子   子池子中含有取池子中的对象&#xff0c;回收池子中的对象&#xff0c;两个功能。 ReusableObject脚本   …