天天看点

c#中如何利用反射动态加载程序集

首先,新建一个类库,生成一个dll文件,内部代码如下:

using System;

namespace ClassLibrary3
{
    public class Class1
    {

        public int Add(int x,int y)
        {
            return x + y;
        }
    }
}
           

生成出一个ClassLibrary3.dll 文件,将这个文件复制进入项目生成的exe文件的同一个文件夹下,然后使用下面代码加载动态加载dll:

using System;
using System.Reflection;
namespace ConsoleApp3
{
    class Program
    {
        static void Main(string[] args)
        {
            Assembly as1 = Assembly.LoadFrom("ClassLibrary3.dll");
            Type t = as1.GetType("ClassLibrary3.Class1");
            MethodInfo[] msi = t.GetMethods();
            Console.Write( msi[0].Invoke(Activator.CreateInstance(t), new object[] { 1, 2 }));
            Console.ReadKey();

        }
    }
}
           

输出结果为:3。在这里需要注意的一点是,如果类Class1有命名空间的话,那么需要加上命名空间,这点在之前的反射的文章中已经指出过,在这边再强调一下。

还有一点有些同学分不清namespace和dll的区别,其实程序集和命名空间实际上没有什么关系。程序集是.NET中相关类型的物理组织形式,有点类似于Windows的可执行文件或者动态链接库文件。命名空间仅仅只是为了解决类名称的冲突问题而提供的给类“分类”的系统。一个程序集可以包含多个命名空间,而一个命名空间也可以跨多个程序集。