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 不能用于载入标识同样但路径不同的程序集。
C#反射Assembly 具体说明的更多相关文章
- 关于反射Assembly.Load("程序集").CreateInstance("命名空间.类")
关于反射Assembly.Load("程序集").CreateInstance("命名空间.类") 而不管在哪一层写这段代码其中的("程序集" ...
- [转]C#反射-Assembly.Load、LoadFrom与LoadFile进阶
关于.NET中的反射,常用的有三个方法: Assembly.Load()Assembly.LoadFrom()Assembly.LoadFile() 下面说说这三个方法的区别和一些细节问题 1. As ...
- C#反射Assembly 详细说明
1.对C#反射机制的理解2.概念理解后,必须找到方法去完成,给出管理的主要语法3.最终给出实用的例子,反射出来dll中的方法 反射是一个程序集发现及运行的过程,通过反射可以得到*.exe或*.dll等 ...
- C#中的反射 Assembly.Load() Assembly.LoadFrom()
一些关于C#反射的知识,估计也就最多达到使用API的程度,至于要深入了解,以现在的水平估计很难做到,所以下面此篇文章,以作为一个阶段的总结. 对于反射的总结,我想从以下几个方面展开,首先是反射程序集, ...
- C#反射-Assembly.Load、LoadFrom与LoadFile
反射Demo: public class Person { public int Age; public void SayHello() { Console.WriteLine("Hello ...
- C#反射Assembly 详细说明,有项目例子
1.对C#反射机制的理解2.概念理解后,必须找到方法去完成,给出管理的主要语法3.最终给出实用的例子,反射出来dll中的方法 反射是一个程序集发现及运行的过程,通过反射可以得到*.exe或*.dll等 ...
- C#反射Assembly 详细说明(转)
1.对C#反射机制的理解2.概念理解后,必须找到方法去完成,给出管理的主要语法3.最终给出实用的例子,反射出来dll中的方法 反射是一个程序集发现及运行的过程,通过反射可以得到*.exe或*.dll等 ...
- c#利用反射Assembly 对类和成员属性进行操作
protected static void test() { //获取程序集 Assembly assembly = System.Reflection.Assembly.GetExecutingAs ...
- 【C#反射】Assembly
Assembly属性的应用 //获取当前执行代码的程序集 Assembly assem = Assembly.GetExecutingAssembly(); Console.WriteLine($&q ...
随机推荐
- itextsharp生成pdf后的直接打印问题
原文 itextsharp生成pdf后的直接打印问题 小弟这两天用itextsharp生成pdf文档,生成的pdf可以直接保存在指定路径的文件夹下,可是user不想保存,想要点一下button,就可以 ...
- 基于visual Studio2013解决C语言竞赛题之0613递归求积
题目
- [033] 微信公众帐号开发教程第9篇-QQ表情的发送与接收(转)
我想大家对QQ表情一定不会陌生,一个个小头像极大丰富了聊天的乐趣,使得聊天不再是简单的文字叙述,还能够配上喜.怒.哀.乐等表达人物心情的小图片.本文重点要介绍的内容就是怎样在微信公众平台使用QQ表情, ...
- 基于集合成工控机Ubuntu系统安装分区详解
基于集合成工控机Ubuntu系统安装分区详解 硬件描述:双核的CPU,128G的固态硬盘 软件描述:使用Ubuntu12.04系统,内核3.8.0-29版本,QT4.8.1版本 1.新建分区表 /de ...
- perl 为什么要用引用来做对象呢?
perl 为什么要用引用来做对象呢? 因为一个重要的原因是 my 引用 脱离作用域,外部仍旧生效
- 略懂 MySQL字符集
本文虽说旨在明白.但若略懂亦可.毕竟诸葛孔明如是 只有基于字符的值才有所谓字符集的概念 某些字符集可能需要更多CPU.消费更多的内存和磁盘空间.甚至影响索引使用 这还不包括令人 ...
- FindChildControl与FindComponent
前两天编码遇到了要使用FindChildControl方法获取指定名称的TSpeedButton按钮,结果折腾了半天就是没得结果(基础不扎实,呵呵),于是赶紧搜索了下,补习关于这两个方法的用法. TW ...
- Unity3D手游-横版ACT游戏完整源代码下载
说明: 这不是武林.这不是江湖,没有道不完的恩怨,没有斩不断的情仇,更没有理不清的烦恼,这是剑的世界,一代剑魁闯入未知世界,将会为这个世界展开什么样的蓝图.让你来创造它的未来,剑魁道天下,一剑斗烛龙! ...
- 编程算法 - 有序双循环链表的插入 代码(C)
有序双循环链表的插入 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 有序双循环链表的插入, 须要找到插入位置, 能够採用, 两个指针, 一个在前, 一 ...
- 如果一个Object对象可能是数组那么如何对其进行迭代
需求:一个方法传入的参数是Object类型(假设对象为“items”,使用Object类型也是为了使用多态而增加方法复用性),但已知这个Object对象可能是基本类型数组,也可能是对象数组,如何将这个 ...