概念
元数据 编译以后最基本的数据单元。本质上就上一大追表。当程序编译之后就能形成很多表,比如类定义表,字段定义表,方法定义表。
反射技术 就是使用REFLACSIOIN命名空间下的工具允许你解析这些元数据代表的代码.
PE文件 被称为可移植的执行体是PortableExecute的全称,常见的EXE、DLL、OCX、SYS、COM都是PE文件,PE文件是微软Windows操作系统上的程序文件(可能是间接被执行,如DLL).在.net程序中pe文件包含两部分,一部分是元数据信息,另外一部分是msIL信息(msil以及标记元数据信息的部分。)
使用的命名空间
System.refloction
System.Type
作用
反射的主要作用是用来扩展系统和动态调用程序集 :
扩展系统:
所谓扩展系统就是先把系统写好,系统里面定义接口,后面开发的人去写接口的代码。此时该系统就要用反射了,系统用反射调用接口,当接口没写,系统利用反射就不会出错,此时就等于没实现此功能而已,当接口被人写好了,系统就会自动调用接口的功能展现在系统上。反射实现即插即用功能。
动态调用程序集
动态调用程序集就是利用反射去调用编译好的dll,当然此时的dll没有被引用到你所建的工程里面。当你编译你的工程时,不会编译你调用的dll,当你运行到调用dll时,此时才会去调用dll,判断是否有语法语义,等编译,运行的错误。这样利用反射具有一定灵活性,就是不用从你的工程调用dll,还有就是dll可随时改变(当然接口还是要对应),不需改变你所建的工程。
示例代码
class Program { static void Main(string[] args) { Console.WriteLine("测试程反射技术。。。"); Assembly ass; Type type; object obj; //1 加载程序集 ass = Assembly.LoadFile(@"D:\MYProject\Thread_sTU\DLL_reflection\bin\Debug\DLL_reflection.dll"); //2 根据程序集信息获取程序集的类型信息. 注意这个方法就是获取元数据中的定义的各种类型(类,方法,属性等)信息。 type = ass.GetType("DLL_reflection.Class1"); //3 根据类型信息获取方法对象 MethodInfo method = type.GetMethod("text"); //4 处理方法对象的参数对象。 object[] paramobj = new object[0] ; //5 创建程序集实例 obj = ass.CreateInstance("DLL_reflection.Class1"); //6 根据方法对象,以及实例对象,方法出参数对象 调用此函数。 method.Invoke(obj, paramobj); Console.WriteLine("测试程反射技术 END "); Console.ReadLine(); } }}