C# Assembly说明
Assembly:[ə'sembli] 装配;集会,集合
在C#里Assembly类表示一个程序集,它是一个可重用、无版本冲突并且可自我描述的公共语言运行时(Common Language Runtime )应用程序构造块,Assembly包含来程序的名称,版本号,自我描述,文件关联关系和文件位置等信息【在项目中有一个Assembly.cs类文件存储着程序集的信息】。该Assembly类在System.Reflection命名空间下,程序集: mscorlib(在 mscorlib.dll 中)。
用处:
使用 Assembly 类可以加载程序集、浏览程序集的元数据和构成部分、发现程序集中包含的类型以及创建这些类型的实例。
程序集总是被加载到应用程序域中运用,所以若要获取Assembly对象数组,可以使用AppDomain对象的GetAssemblies方法。
程序集可以动态加载,Assembly 类可提供下列静态方法。程序集被加载到发生加载操作的应用程序域中。
加载程序集的推荐方式是使用 Load 方法,该方法标识要由其显示名称加载的程序集(例如“System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”)。搜索程序集时遵守运行时如何定位程序集中描述的规则。
使用 ReflectionOnlyLoad 和ReflectionOnlyLoadFrom 方法可以为反射加载程序集,但不能为执行加载程序集。例如,可以由在 32 位平台上运行的代码检查针对 64 位平台的程序集。
LoadFile 和LoadFrom 方法是为必须由路径标识程序集的极少数方案提供的。(提供程序集路径)
若要获取当前执行的程序集的 Assembly 对象,可以使用GetExecutingAssembly 方法。
Assembly 类的许多成员都提供有关程序集的信息。例如:
GetName 方法返回一个AssemblyName 对象,该对象提供对程序集显示名称部分的访问。
GetCustomAttributes 方法列出应用于程序集的特性。
GetFiles 方法提供对程序集清单中文件的访问。
GetManifestResourceNames 方法提供程序集清单中资源的名称。
GetTypes 方法列出程序集中的所有类型。GetExportedTypes 方法列出对程序集以外的调用方可见的类型。GetType 方法可用于在程序集中搜索特定类型。CreateInstance 方法可用于在程序集中搜索和创建类型的实例。
推荐扩展学习反射、应用程序域、特性等知识
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学习心得
http://blog.csdn.net/etmonitor/ Assembly学习心得 说明: 最近开始准备把学到的.NET知识重新整理一遍,眼过千遍不如手过一遍,所以我准备记下我的学习心得,已备参 ...
- Could not load file or assembly App_Licenses.dll的问题
今天在AspDotNetStorefront做定制化开发,编译的时候莫名其妙地报告Could not load file or assembly 'App_Licenses, Version=0.0. ...
- [Tips]:SQL server 2005 Create Assembly Failed
今天创建SQL server2005 程序集时,提示权限失败,我是sa权限. 最后通过 添加如下这句才得以通过 1: ALTER DATABASE [TestDB] SET TRUSTWORTHY O ...
- de novo assembly是新的基因组装配
de novo assembly是新的基因组装配,(de novo 的意思是全新,assembly是序列拼接),即在没有参考序列的情况下进行序列拼接,对未知基因组序列进行测序,利用生物信息学分析手段, ...
- Genome Sequencing and Assembly by Long Reads in Plants植物基因组的长读测序与组装
Genome Sequencing and Assembly by Long Reads in Plants 植物基因组的长读测序与组装 Abstract: Plant genomes generat ...
- Accurate circular consensus long-read sequencing improves variant detection and assembly of a human
Accurate circular consensus long-read sequencing improves variant detection and assembly of a human ...
- Comparison of long-read sequencing technologies in the hybrid assembly of complex bacterial genomes
Comparison of long-read sequencing technologies in the hybrid assembly of complex bacterial genomes ...
- Ratatosk - Hybrid error correction of long reads enables accurate variant calling and assembly
Ratatosk - Hybrid error correction of long reads enables accurate variant calling and assembly 长读的 ...
- The power of single molecule real-time sequencing technology in the de novo assembly of a eukaryotic
The power of single molecule real-time sequencing technology in the de novo assembly of a eukaryotic ...
- E. coli Bacterial Assembly 大肠杆菌
使用Scaffold因为缺乏完整的基因组 https://github.com/PacificBiosciences/DevNet/wiki/E.-coli-Bacterial-Assembly 该记 ...
最新文章
- 当代的设计潮流是什么_解码“潮流合伙人”IP生意经
- 记录智能指针使用shared_ptr使用错误
- SVM为什么采用间隔最大化?SVM为什么将原始问题转换为其对偶问题?
- java jpanel添加背景_java – 将背景图像添加到JPanel
- 基于SSH框架实际开发时遇到的问题及解决办法
- 四种常见的 POST 提交数据方式
- 从家书到小票!看到海尔智家的转型是真的
- 修改mysql字符集 为utf8_修改mysql数据库字符集为UTF8的
- 安装指定版本pytorch_Ubuntu16.04安装pytorch(七)
- java builder pattern_Java Builder Pattern建造者模式详解及实例
- python办公室应用_Python干货:玩转办公室软件(一)PP还能这样玩!
- 六、 抽象类与接口对比
- python连接pymysql主机目标无响应_Python 解析pymysql模块操作数据库的方法
- mysql 怎么导入sql文件_如何在MySQL中使用命令行导入SQL文件?
- 【51单片机】蜂鸣器程序
- 华为的少将人才选拔方法
- java autorun_玩转Autorun.inf
- 空间几何变换 之 齐次坐标
- arch(linux)挂接小鹤音形输入法
- 云南计算机专升本经验分享