首先,新建一个类库,生成一个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的可执行文件或者动态链接库文件。命名空间仅仅只是为了解决类名称的冲突问题而提供的给类“分类”的系统。一个程序集可以包含多个命名空间,而一个命名空间也可以跨多个程序集。