谈谈程序集加载和反射机制

一、程序集的加载

成都创新互联公司是一家专注于成都网站设计、做网站、成都外贸网站建设公司与策划设计,兴海网站建设哪家好?成都创新互联公司做网站,专注于网站建设十年,网设计领域的专业建站公司;建站业务涵盖:兴海等地区。兴海做网站价格咨询:028-86922220

JIT编译器器将IL代码编译成本地代码时, 会查看IL代码中引用了哪些类型。在运行过程中,JIT编译器利用程序集的TypeRef和AssemblyRef元数据表来确定哪一个程序集定义了所引用的类型,然后JIT编译器将对应程序集加载到AppDomain中,在内部,CLR使用System.Reflection.Assembly类的静态方法Load来尝试加载一个程序集。然而如果我们想动态加载一个程序集时,可以使用Assembly的Load方法来动态加载程序集,其中Assembly类中还提供了其他的加载程序集方法,有LoadFrom(string path), LoadFile(stringassemblyFile)等,具体方法的使用和解释可以参照MSDN中的介绍:http://msdn.microsoft.com/zh-cn/library/xbe1wdx9

二、反射机制

.net中反射在运行中过程中解析程序集中的元数据,获得类型中的成员(包括字段、构造器、方法、属性、事件等)信息。

动态加载一个程序集并获得类型中的成员

把下面的类放在一个类库工程中,并编译生成程序集(例如为ClassLibrary1.dll,假设把dll放在D盘根目录下面)

 
 
 
  1. public class ReflectTestClass 
  2.    { 
  3.       public  string name; 
  4.       public int age; 
  5.       public string Name 
  6.       { 
  7.           get { return name; } 
  8.           set { name = value; } 
  9.       } 
  10.  
  11.       public int Age 
  12.       { 
  13.           get { return age; } 
  14.           set { age = value; } 
  15.       } 
  16.  
  17.        ///  
  18.        /// No Paramter Constructor 
  19.        ///  
  20.       public ReflectTestClass() 
  21.       {  
  22.       } 
  23.  
  24.        ///  
  25.        /// Constructor with Parameter 
  26.        ///  
  27.        ///  
  28.        ///  
  29.        public ReflectTestClass(string names,int ages) 
  30.        { 
  31.            this.name = names; 
  32.            this.age = ages; 
  33.        } 
  34.  
  35.        public string writeString(string name) 
  36.        { 
  37.            return "Welcome " + name; 
  38.        } 
  39.  
  40.        public static string WriteName(string name) 
  41.        { 
  42.            return "Welcome "+name +" Come here"; 
  43.        } 
  44.  
  45.        public string WirteNopara() 
  46.        { 
  47.            return "The method is no parameter "; 
  48.        } 
  49.    } 

然后建立一个控制台程序用来动态加载上面生成的程序集和输出类型中的成员,代码中有详细的介绍。

 
 
 
  1. class Program 
  2.     { 
  3.         static void Main(string[] args) 
  4.         { 
  5.             Assembly ass; 
  6.             Type[] types; 
  7.             Type typeA; 
  8.             object obj; 
  9.             try 
  10.             { 
  11.                 // 从本地中 加载程序集 然后从程序集中通过反射获得类型的信息的,并且调用方法 
  12.                 ass = Assembly.LoadFrom(@"D:\ClassLibrary1.dll"); 
  13.                 types = ass.GetTypes(); 
  14.                 foreach (Type type in types) 
  15.                 { 
  16.                     Console.WriteLine("Class Name is " + type.FullName); 
  17.                     Console.WriteLine("Constructor Information"); 
  18.                     Console.WriteLine("-----------------------"); 
  19.                     // 获取类型的结构信息 
  20.                     ConstructorInfo[] myconstructors = type.GetConstructors(); 
  21.                     ShowMessage(myconstructors); 
  22.  
  23.                     Console.WriteLine("Fields Information"); 
  24.                     Console.WriteLine("-----------------------"); 
  25.                     // 获取类型的字段信息 
  26.                     FieldInfo[] myfields = type.GetFields(); 
  27.                     ShowMessage(myfields); 
  28.  
  29.                     Console.WriteLine("All Methods Information"); 
  30.                     Console.WriteLine("-----------------------"); 
  31.                     // 获取方法信息 
  32.                     MethodInfo[] myMethodInfo = type.GetMethods(); 
  33.                     ShowMessage(myMethodInfo); 
  34.  
  35.                     Console.WriteLine("All Properties Information"); 
  36.                     Console.WriteLine("-----------------------"); 
  37.                     // 获取属性信息 
  38.                     PropertyInfo[] myproperties = type.GetProperties(); 
  39.                     ShowMessage(myproperties); 
  40.                 } 
  41.  
  42.                 // 用命名空间+类名获取类型 
  43.                 typeA = ass.GetType("ClassLibrary1.ReflectTestClass"); 
  44.                  
  45.                 // 获得方法名称 
  46.  
  47.                 MethodInfo method = typeA.GetMethod("writeString"); 
  48.  
  49.                 // 创建实例 
  50.                 obj = ass.CreateInstance("ClassLibrary1.ReflectTestClass"); 
  51.  
  52.                 string result = (String)method.Invoke(obj,new string[] {"Tom"}); 
  53.                 Console.WriteLine("Invoke Method With Parameter"); 
  54.                 Console.WriteLine("-----------------------"); 
  55.                 Console.WriteLine(result); 
  56.                 Console.WriteLine("-----------------------"); 
  57.                 Console.WriteLine(); 
  58.                 method = typeA.GetMethod("WriteName"); 
  59.                 result = (string)method.Invoke(null,new string[] {"Tom"}); 
  60.                 Console.WriteLine("Invoke Static Method with Parameter"); 
  61.                 Console.WriteLine("-----------------------"); 
  62.                 Console.WriteLine(result); 
  63.                 Console.WriteLine("-----------------------"); 
  64.                 Console.WriteLine(); 
  65.                 method = typeA.GetMethod("WirteNopara"); 
  66.                 Console.WriteLine("Invoke Method with NOParameter"); 
  67.                 result = (string)method.Invoke(obj, null); 
  68.                 Console.WriteLine("-----------------------"); 
  69.                 Console.WriteLine(result); 
  70.                 Console.WriteLine("-----------------------"); 
  71.             } 
  72.  
  73.             catch(FileNotFoundException ex) 
  74.             { 
  75.                 Console.WriteLine(ex.Message); 
  76.             } 
  77.  
  78.             Console.ReadLine(); 
  79.         } 
  80.  
  81.         ///  
  82.         /// 显示数组信息 
  83.         ///  
  84.         ///  
  85.         ///  
  86.         public static void ShowMessage(T[] array) 
  87.         {  
  88.             foreach(T member in array) 
  89.             { 
  90.                 Console.WriteLine(member.ToString()); 
  91.             } 
  92.  
  93.             Console.WriteLine("-----------------------"); 
  94.             Console.WriteLine(); 
  95.         } 
  96.     } 

筛选返回的成员种类

可以调用Type的GetMembers,GetFields,GetMethods,GetProperties或者GetEvenents方法来查询一个类型的成员。在调用上面的任何一个方法时,都可以传递System.Reflection.BindingFlags枚举类型的一个实例,使用这个枚举类型目的是对这些方法返回的成员进行筛选。对于这个枚举类型中成员的信息可以参考MSDN:http://msdn.microsoft.com/zh-cn/library/system.reflection.bindingflags(v=VS.80).aspx

注意:在返回一个成员集合的所有方法中, 都有一个不获取任何实参的重载版本。如果不传递BindingFlags实参,所有这些方法都返回公共成员,默认设置为BindingFlags.Public|BindingFlags.Instance|BindingFlags.Static. (如果指定Public或NonPublic,那么必须同时指定Instance,否则不返回成员)。

分享标题:谈谈程序集加载和反射机制
浏览路径:http://www.shufengxianlan.com/qtweb/news11/43561.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联