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

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去获取我们想要获取的内容,然后去操作它们。
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值