日期:2014-05-17  浏览次数:21053 次

c# 反射技术杂谈。,

概念

反射 能够查看元数据的类型,等信息的一种能力。

元数据 编译以后最基本的数据单元。本质上就上一大追表。当程序编译之后就能形成很多表,比如类定义表,字段定义表,方法定义表。

反射技术 就是使用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();
        }
    }
}