C#反射Assembly 具体说明

1、对C#反射机制的理解

2、概念理解后,必须找到方法去完毕,给出管理的主要语法

3、终于给出有用的样例,反射出来dll中的方法

反射是一个程序集发现及执行的过程,通过反射能够得到*.exe或*.dll等程序集内部的信息。使用反射能够看到一个程序集内部的接口、类、方法、字段、属性、特性等等信息。在System.Reflection命名空间内包括多个反射经常使用的类,以下表格列出了经常使用的几个类。

类型 作用

Assembly 通过此类能够载入操纵一个程序集,并获取程序集内部信息

EventInfo 该类保存给定的事件信息

FieldInfo 该类保存给定的字段信息

MethodInfo 该类保存给定的方法信息

MemberInfo 该类是一个基类,它定义了EventInfo、FieldInfo、MethodInfo、PropertyInfo的多个公用行为

Module 该类能够使你能訪问多个程序集中的给定模块

ParameterInfo 该类保存给定的參数信息      

PropertyInfo 该类保存给定的属性信息

一、System.Reflection.Assembly类

通过Assembly能够动态载入程序集,并查看程序集的内部信息,当中最经常使用的就是Load()这种方法。

Assembly assembly=Assembly.Load("MyAssembly");

利用Assembly的object CreateInstance(string) 方法能够反射创建一个对象,參数0为类名。

二、System.Type类

Type是最经常使用到的类,通过Type能够得到一个类的内部信息,也能够通过它反射创建一个对象。一般有三个经常使用的方法可得到Type对象。

利用typeof() 得到Type对象

Type type=typeof(Example);

利用System.Object.GetType() 得到Type对象

Example example=new Example();

Type type=example.GetType();

利用System.Type.GetType() 得到Type对象

Type type=Type.GetType("MyAssembly.Example",false,true);

注意參数0是类名,參数1表示若找不到相应类时是否抛出异常,參数1表示类名是否区分大写和小写

样例:

我们最常见的是利用反射与Activator结合来创建对象。

Assembly assembly= Assembly.Load("MyAssembly");

Type type=assembly.GetType("Example");

object obj=Activator.CreateInstance(type);

三、反射方法

1.通过 System.Reflection.MethodInfo能查找到类里面的方法

Type type=typeof(Example);
    MethodInfo[] listMethodInfo=type.GetMethods();
    foreach(MethodInfo methodInfo in listMethodInfo)
         Cosole.WriteLine("Method name is "+methodInfo.Name);

2.我们也能通过反射方法运行类里面的方法2.我们也能通过反射方法运行类里面的方法

Assembly assembly= Assembly.Load("MyAssembly");
   Type type=assembly.GetType("Example");
   object obj=Activator.CreateInstance(type);
   MethodInfo methodInfo=type.GetMethod("Hello World");  //依据方法名获取MethodInfo对象
   methodInfo.Invoke(obj,null);  //參数1类型为object[],代表Hello World方法的相应參数,输入值为null代表没有參数

四、反射属性

1.通过 System.Reflection.PropertyInfo 能查找到类里面的属性

经常使用的方法有GetValue(object,object[]) 获取属性值和 SetValue(object,object,object[]) 设置属性值

四、反射属性

1.通过 System.Reflection.PropertyInfo 能查找到类里面的属性

经常使用的方法有GetValue(object,object[]) 获取属性值和 SetValue(object,object,object[]) 设置属性值

四、反射属性

1.通过 System.Reflection.PropertyInfo 能查找到类里面的属性

经常使用的方法有GetValue(object,object[]) 获取属性值和 SetValue(object,object,object[]) 设置属性值

Type type=typeof(Example);
    PropertyInfo[] listPropertyInfo=type.GetProperties();
    foreach(PropertyInfo propertyInfo in listPropertyInfo)
         Cosole.WriteLine("Property name is "+ propertyInfo.Name);

2.我们也能够通过下面方法设置或者获取一个对象的属性值2.我们也能够通过下面方法设置或者获取一个对象的属性值

 Assembly assembly=Assembly.Load("MyAssembly");
   Type type=assembly.GetType("Example");
   object obj=Activator.CreateInstance(type);
   PropertyInfo propertyInfo=obj.GetProperty("Name");    //获取Name属性对象
   var name=propertyInfo.GetValue(obj,null);                //获取Name属性的值
   PropertyInfo propertyInfo2=obj.GetProperty("Age");     //获取Age属性对象
   propertyInfo.SetValue(obj,34,null);                              //把Age属性设置为34

五、反射字段

通过 System.Reflection.FieldInfo 能查找到类里面的字段

它包含有两个经常用法SetValue(object ,object )和GetValue(object)  由于用法与反射属性很相似,在此不再多作介绍

(略)

六、反射特性

通过System.Reflection.MemberInfo的GetCustomAttributes(Type,bool)就可反射出一个类里面的特性,下面样例能够反射出一个类的全部特性

五、反射字段

通过 System.Reflection.FieldInfo 能查找到类里面的字段

它包含有两个经常用法SetValue(object ,object )和GetValue(object)  由于用法与反射属性很相似,在此不再多作介绍

(略)

六、反射特性

通过System.Reflection.MemberInfo的GetCustomAttributes(Type,bool)就可反射出一个类里面的特性,下面样例能够反射出一个类的全部特性

Type type=typeof("Example");
   object[] typeAttributes=type.GetCustomAttributes(false);       //获取Example类的特性
   foreach(object attribute in typeAttributes)
         Console.WriteLine("Attributes description is "+attribute.ToString());

通过以下样例,能够获取Example类Name属性的全部特性通过以下样例,能够获取Example类Name属性的全部特性

public class Example
   {
         [DataMemberAttribute]
         publics string Name
          {get;set;}
        ..................
    }
    Type type = typeof(Example);
    PropertyInfo propertyInfo=type.GetProperty("Name");    //获取Example类的Name属性
    foreach (object attribute in propertyInfo.GetCustomAttributes(false))        //遍历Name属性的全部特性
           Console.WriteLine(“Property attribute: "+attribute.ToString());

总结:

Assembly.Load()方法,Assembly.LoadFrom()方法,Assembly.LoadFile()方法的差别

在C#中,我们要使用反射,首先要搞清楚下面命名空间中几个类的关系:

System.Reflection命名空间

(1)   AppDomain:应用程序域,能够将其理解为一组程序集的逻辑容器

(2)   Assembly:程序集类

(3)   Module:模块类

(4)   Type:使用反射得到类型信息的最核心的类

他们之间是一种从属关系,也就是说,一个AppDomain能够包括N个Assembly,一个Assembly能够包括N个Module,而一个Module能够包括N个Type.

1,Assembly.Load()

这种方法通过程序集的长名称(包含程序集名,版本号信息,语言文化,公钥标记)来载入程序集的,会载入此程序集引用的其它程序集,普通情况下都应该优先使用 这种方法,他的运行效率比LoadFrom要高非常多,并且不会造成反复载入的问题(原因在第2点上说明)

使用这种方法的时候, CLR会应用一定的策略来查找程序集,实际上CLR按例如以下的顺序来定位程序集:

⑴假设程序集有强名称,在首先在全局程序集缓(GAC)中查找程序集。

⑵假设程序集的强名称没有正确指定或GAC中找不到,那么通过配置文件里的<codebase>元素指定的URL来查找

⑶假设没有指定强名称或是在GAC中找不到,CLR会探測特定的目录:

如果你的应用程序文件夹是C:\AppDir,<probing>元素中的privatePath指定了一个路径Path1,你要定位的程序集是AssemblyName.dll则CLR将依照例如以下顺序定位程序集

C:\AppDir\AssemblyName.dll

C:\AppDir\AssemblyName\AssemblyName.dll

C:\AppDir\Path1\AssemblyName.dll

C:\AppDir\Path1\AssemblyName\AssemblyName.dll

假设以上方法不能找到程序集,会发生编译错误,假设是动态载入程序集,会在执行时抛出异常!

2,Assembly.LoadFrom()

这种方法从指定的路径来载入程序集,实际上这种方法被调用的时候,CLR会打开这个文件,获取当中的程序集版本号,语言文化,公钥标记等信息,把他们传递给 Load方法,接着,Load方法採用上面的策略来查找程序集。假设找到了程序集,会和LoadFrom方法中指定的路径做比較,假设路径同样,该程序集 会被觉得是应用程序的一部分,假设路径不同或Load方法没有找到程序集,那该程序集仅仅是被作为一个"数据文件"来载入,不会被觉得是应用程序的一部分。 这就是在第1点中提到的Load方法比LoadFrom方法的运行效率高的原因。另外,因为可能把程序集作为"数据文件"来载入,所以使用
LoadFrom从不同路径载入同样程序集的时候会导致反复载入。当然这种方法会载入此程序集引用的其它程序集。

3,Assembly.LoadFile()

这种方法是从指定的文件来载入程序集,和上面方法的不同之处是这种方法不会载入此程序集引用的其它程序集!

结论:一般大家应该优先选择Load方法来载入程序集,假设遇到须要使用LoadFrom方法的时候,最好改变设计而用Load方法来取代!

另:Assembly.LoadFile 与 Assembly.LoadFrom的差别

1、Assembly.LoadFile仅仅加载对应的dll文件,比方Assembly.LoadFile("abc.dll"),则加载abc.dll,假如abc.dll中引用了def.dll的话,def.dll并不会被加载。

Assembly.LoadFrom则不一样,它会加载dll文件及其引用的其它dll,比方上面的样例,def.dll也会被加载。

2、用Assembly.LoadFrom加载一个Assembly时,会先检查前面是否已经加载过同样名字的Assembly,比方abc.dll有两个版本号(版本号1在文件夹1下,版本号2放在文件夹2下),程序一開始时加载了版本号1,当使用Assembly.LoadFrom("2\\abc.dll")加载版本号2时,不能加载,而是返回版本号1.Assembly.LoadFile的话则不会做这种检查,比方上面的样例换成Assembly.LoadFile的话,则能正确加载版本号2.

LoadFile:载入指定路径上的程序集文件的内容。LoadFrom: 依据程序集的文件名称载入程序集文件的内容。

差别:

LoadFile 方法用来来载入和检查具有同样标识但位于不同路径中的程序集。但不会载入程序的依赖项。

LoadFrom 不能用于载入标识同样但路径不同的程序集。

总结:

Assembly.Load()方法,Assembly.LoadFrom()方法,Assembly.LoadFile()方法的差别

在C#中,我们要使用反射,首先要搞清楚下面命名空间中几个类的关系:

System.Reflection命名空间

(1)   AppDomain:应用程序域,能够将其理解为一组程序集的逻辑容器

(2)   Assembly:程序集类

(3)   Module:模块类

(4)   Type:使用反射得到类型信息的最核心的类

他们之间是一种从属关系,也就是说,一个AppDomain能够包括N个Assembly,一个Assembly能够包括N个Module,而一个Module能够包括N个Type.

1,Assembly.Load()

这种方法通过程序集的长名称(包含程序集名,版本号信息,语言文化,公钥标记)来载入程序集的,会载入此程序集引用的其它程序集,普通情况下都应该优先使用 这种方法,他的运行效率比LoadFrom要高非常多,并且不会造成反复载入的问题(原因在第2点上说明)

使用这种方法的时候, CLR会应用一定的策略来查找程序集,实际上CLR按例如以下的顺序来定位程序集:

⑴假设程序集有强名称,在首先在全局程序集缓(GAC)中查找程序集。

⑵假设程序集的强名称没有正确指定或GAC中找不到,那么通过配置文件里的<codebase>元素指定的URL来查找

⑶假设没有指定强名称或是在GAC中找不到,CLR会探測特定的目录:

如果你的应用程序文件夹是C:\AppDir,<probing>元素中的privatePath指定了一个路径Path1,你要定位的程序集是AssemblyName.dll则CLR将依照例如以下顺序定位程序集

C:\AppDir\AssemblyName.dll

C:\AppDir\AssemblyName\AssemblyName.dll

C:\AppDir\Path1\AssemblyName.dll

C:\AppDir\Path1\AssemblyName\AssemblyName.dll

假设以上方法不能找到程序集,会发生编译错误,假设是动态载入程序集,会在执行时抛出异常!

2,Assembly.LoadFrom()

这种方法从指定的路径来载入程序集,实际上这种方法被调用的时候,CLR会打开这个文件,获取当中的程序集版本号,语言文化,公钥标记等信息,把他们传递给 Load方法,接着,Load方法採用上面的策略来查找程序集。假设找到了程序集,会和LoadFrom方法中指定的路径做比較,假设路径同样,该程序集 会被觉得是应用程序的一部分,假设路径不同或Load方法没有找到程序集,那该程序集仅仅是被作为一个"数据文件"来载入,不会被觉得是应用程序的一部分。 这就是在第1点中提到的Load方法比LoadFrom方法的运行效率高的原因。另外,因为可能把程序集作为"数据文件"来载入,所以使用
LoadFrom从不同路径载入同样程序集的时候会导致反复载入。当然这种方法会载入此程序集引用的其它程序集。

3,Assembly.LoadFile()

这种方法是从指定的文件来载入程序集,和上面方法的不同之处是这种方法不会载入此程序集引用的其它程序集!

结论:一般大家应该优先选择Load方法来载入程序集,假设遇到须要使用LoadFrom方法的时候,最好改变设计而用Load方法来取代!

另:Assembly.LoadFile 与 Assembly.LoadFrom的差别

1、Assembly.LoadFile仅仅加载对应的dll文件,比方Assembly.LoadFile("abc.dll"),则加载abc.dll,假如abc.dll中引用了def.dll的话,def.dll并不会被加载。

Assembly.LoadFrom则不一样,它会加载dll文件及其引用的其它dll,比方上面的样例,def.dll也会被加载。

2、用Assembly.LoadFrom加载一个Assembly时,会先检查前面是否已经加载过同样名字的Assembly,比方abc.dll有两个版本号(版本号1在文件夹1下,版本号2放在文件夹2下),程序一開始时加载了版本号1,当使用Assembly.LoadFrom("2\\abc.dll")加载版本号2时,不能加载,而是返回版本号1.Assembly.LoadFile的话则不会做这种检查,比方上面的样例换成Assembly.LoadFile的话,则能正确加载版本号2.

LoadFile:载入指定路径上的程序集文件的内容。LoadFrom: 依据程序集的文件名称载入程序集文件的内容。

差别:

LoadFile 方法用来来载入和检查具有同样标识但位于不同路径中的程序集。但不会载入程序的依赖项。

LoadFrom 不能用于载入标识同样但路径不同的程序集。

时间: 2024-11-01 10:00:24

C#反射Assembly 具体说明的相关文章

关于反射Assembly.Load(&quot;程序集&quot;).CreateInstance(&quot;命名空间.类&quot;)

关于反射Assembly.Load("程序集").CreateInstance("命名空间.类") 而不管在哪一层写这段代码其中的("程序集")读取的实际是web层bin文件夹下的dll,也就是说你反射的类的程序集dll在web层的bin下必须有 Assembly.Load("程序集名") Assembly.LoadFrom("程序集实际路径") 说到加载程序集,有两种方法Assembly.LoadFrom

C#反射Assembly IoC的一个实例

1.定义一个抽象类ServiceFactory,用来得到T接口的实现对象 public abstract class ServiceFactory { public abstract T CreateService<T>() where T : class; } 2.首先通过反射机制得到该interface的名字.得到该interface的实现实例后并缓存它. /// <summary> /// 直接引用提供服务 /// </summary> public class

C#反射Assembly 详细说明

1.对C#反射机制的理解2.概念理解后,必须找到方法去完成,给出管理的主要语法3.最终给出实用的例子,反射出来dll中的方法 反射是一个程序集发现及运行的过程,通过反射可以得到*.exe或*.dll等程序集内部的信息.使用反射可以看到一个程序集内部的接口.类.方法.字段.属性.特性等等信息.在System.Reflection命名空间内包含多个反射常用的类,下面表格列出了常用的几个类.类型 作用 Assembly 通过此类可以加载操纵一个程序集,并获取程序集内部信息 EventInfo 该类保存

C#反射-Assembly.Load、LoadFrom与LoadFile进阶

关于.NET中的反射,常用的有三个方法: Assembly.Load()Assembly.LoadFrom()Assembly.LoadFile() 下面说说这三个方法的区别和一些细节问题 1. Assembly.Load() 简介 Load()方法接收一个String或AssemblyName类型作为参数,这个参数实际上是需要加载的程序集的强名称(名称,版本,语言,公钥标记).例如.NET 2.0中的FileIOPermission类,它的强名称是: System.Security.Permi

关于C#反射Assembly.load() .CreateInstance() 未报错, 返回对象为空

这几天开始新项目,在AbstractDalFactory反射实例的时候,遇到的问题是load程序集成功,但是Create实例为null. 被反射的程序集名称和命名空间都为s2s.Dal, 刚开始我在想,会不会是中间的有个点 . 的问题,转而一想不可能啊,因为我AutoFac依赖注入s2s.BLL对象的时候,中间也有的点.啊. 第一天晚上调试了几个小时,今天晚上调试几个小时之后我终于决定重新创建一个DAL程序集,命名为s2s_Dal. 果然问题解决了. 按照情况来看,的确是.影响了.NETFram

.Net 反射

反射是.NET中的重要机制,通过反射,可以在运行时获得程序或程序集中每一个类型(包括类.结构.委托.接口和枚举等)的成员和成员的信息.有了反射,即可对每一个类型了如指掌.另外我还可以直接创建对象,即使这个对象的类型在编译时还不知道.     反射的用途:    (1)使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例.     (2)使用Module了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法或其他特定的非全

接触C# 反射

1.反射的概念详解[1] 1.1 理解C#中的反射 1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内脏的生理情况.这是如何做到的呢?B超是B型超声波,它可以透过肚皮通过向你体内 发射B型超声波,当超声波遇到内脏壁的时候就会产生一定的“回音”反射,然后把“回音”进行处理就可以显示出内脏的情况了(我不是医生也不是声学专家,不 知说得是否准确^_^). 2.地球内部结构:地球的内部结构大体可以分为三层:地壳.地幔和地核.地壳是固体,地核是液体,地幔则是半液半固的结构(中学地理的内容

反射,System.Type类

http://m.blog.csdn.net/blog/woddle/40623333 两个现实中的例子:1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内脏的生理情况.这是如何做到的呢?B超是B型超声波,它可以透过肚皮通过向你体内发射B型超声波,当超声波遇到内脏壁的时候就会产生一定的“回音”反射,然后把“回音”进行处理就可以显示出内脏的情况了(我不是医生也不是声学专家,不知说得是否准确^_^).2.地球内部结构:地球的内部结构大体可以分为三层:地壳.地幔和地核.地壳是固体,地

工厂模式的Assembly.Load(path).CreateInstance(className)出错解决方法

1.问题描述 ★代码展示 下面是Factory中的一段代码: '********************************************** ' 文 件 名:DataAcess ' 命名空间:Factory ' 内 容: ' 功 能:创建用户需要的接口 ' 文件关系: ' 作 者:令仔很忙 ' 小 组: ' 生成日期:2014-07-28 17:37:52 ' 版 本 号:V2.0 ' 修改日志: ' 版权说明: '********************************