在.Net 中,程序集(Assembly)中保存了元数据(MetaData)信息,因此就可以通过分析元数据来获取程序集中的内容,比如类,方法,属性等,这大大方便了在运行时去动态创建实例。
主要用途:
- 动态加载DLL,实现插件机制。
- 实例化DLL中的类型。
- 执行后期绑定,访问在运行时创建的类型的方法。
首先,新建一个空白解决方案:DllSolution
向解决方案中添加一个类库:RefDll,这将是需要被动态创建的程序集
重命名默认新建的Class1类:Student,这个类将是需要动态创建的类。有一个Name属性和一个SayHello方法
namespace RefDll { public class Student { public string Name { get; set; } public void SayHello(string content) { Console.WriteLine(string.Format("{0} say {1} to everybody.", Name, content)); } } }
再向解决方案中添加一个控制台项目:ConsoleApplication,设为启动项
代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication { class Program { static void Main(string[] args) { //1、该方法传入的是Dll的名字,该Dll必须引用 //var asmLoad = Assembly.Load("RefDll"); //2、这个LoadFile最方便,参数就是dll的路径 var asmLoad = Assembly.LoadFile(@"C:UserslenovoDesktopDllSolutionRefDllinDebugRefDll.dll"); //3、这个方法也可以,参数同样是dll路径 //var asmLoad = Assembly.LoadFrom(@"C:UserslenovoDesktopDllSolutionRefDllinDebugRefDll.dll"); //方法1 ////获取类的类型,命名空间+类名 //var type = asmLoad.GetType("RefDll.Student"); ////创建类的实例,命名空间+类名 //var instance = asmLoad.CreateInstance("RefDll.Student"); //方法2 //获取类的类型 var type = asmLoad.GetTypes().ElementAt(0); //创建类的实例 var instance = Activator.CreateInstance(type); //设置实例中某一属性的值 type.GetProperty("Name").SetValue(instance, "zhangsan", null); //获取类中的方法 var method = type.GetMethod("SayHello"); //调用方法 method.Invoke(instance, new object[] { "hello" }); Console.Read(); } } }
结果:zhangsan say hello to everybody.