.net 程序集的加载与反射
一. 程序集的加载:
在CLR内部使用System.Reflection.Assembly类的静态LoadFrom方法尝试加载程序集。
LoadFrom方法在内部调用Assembly的Load方法,将AssemblyName对象传给它,然后CLR应用版本绑定从定向策略,并在各个位置查询匹配的程序集。Load找到匹配的程序集就会加载它。如果Load没有找到匹配的程序集,LoadFrom会通过LoadFrom的实参传递的路劲中的程序集。
//LoadFrom 根据已知的程序集路径加载程序集
Assembly a = Assembly.LoadFrom("@c://query.dll");
如果传递的是一个Internet位置,CLR会下载文件,吧它安装到用户的下载缓存中,再从那里加载。注意必须联网,否则会抛异常。但是如果是之前下载过的文件,然后再脱机状态下会使用以前下载的文件,不会抛出异常。
还可以调用UnsafeLoadFrom,它能够加载从互联网上下载的程序集,同时绕过一些安全检查。
一般其他工具是使用Assemly 的LoadFile方法任意加载程序集。
使用 Assembly.ReflectionOnlyLoadFrom 或Assembly.ReflectionOnlyLoad 加载程序集时,CLR静止程序集中的任何代码执行。试图执行由这两个方法加载的程序集中的代码时,CLR会抛出异常。
二. 使用反射构建动态可扩展应用程序。
反射的相当强大的,允许在运行时发现并使用编译时还不了解的类型及其成员。但是,它也有两个缺点。
a. 反射造成编译时无法保证类型安全。由于反射严重依赖字符串,所以会丧失编译时的类型安全性。
b. 反射速度慢。使用反射时,类型及其成员在编译时位置;你要用字符串名称标示每个类型,及其成员,然后运行时发现他们。
也就是说反射机制会不停的执行字符串搜索。
利用System.Reflection命名空间包含的类型,可以反射解析对应元数据类型的字段,方法,属性,和事件。
三. 发现程序集中定义的类型
Assembly的ExportedTypes属性: 显示其中定义的所有公开导出的类型
static void Main(string[] args)
{
// 反射
string dataAssembly = "System.Data,version=4.0.0.0,culture=neutral,PublicKeyToken=b77a5c561934e089";
ReflectionTempte.LoadAssemAndShowPublicTypes(dataAssembly);
} public static void LoadAssemAndShowPublicTypes(string assemId)
{
Assembly a = Assembly.Load(assemId);
//循环显示已加载程序集中的每个公开类型 导出Type的全名
foreach (Type t in a.ExportedTypes)
{
//显示全名
Console.WriteLine(t.FullName);
}
}
.net 程序集的加载与反射的更多相关文章
- 【C#】解析C#程序集的加载和反射
目录结构: contents structure [+] 程序集 程序集的加载 发现程序集中的类型 反射对类型成员的常规操作 发现类型的成员 创建类型的实例 绑定句柄减少进程的内存消耗 解析自定义特性 ...
- Clr Via C#读书笔记---程序集的加载和反射
#1 加载程序集 Assembly.Load: public class Assembly { public static Assembly Load(AssemblyName assemblyRef ...
- clr via c# 程序集加载和反射(2)
查看,clr via c# 程序集加载和反射(1) 8,发现类型的成员: 字段,构造器,方法,属性,事件,嵌套类型都可以作为类型成员.其包含在抽象类MemberInfo中,封装了所有类型都有的一组属性 ...
- clr via c# 程序集加载和反射集(一)
1,程序集加载---弱的程序集可以加载强签名的程序集,但是不可相反.否则引用会报错!(但是,反射是没问题的) //获取当前类的Assembly Assembly.GetEntryAssembly() ...
- .net加载失败的程序集重新加载
在.net程序中,程序集是Lazy加载的,只有在用的时候才会去加载,当程序集加载失败时,会触发AppDomain.AssemblyResolve的事件,在这个事件中,我们甚至还可以进行补救,从别得地方 ...
- 显示名为“xxx.XmlSerializers”的程序集未能加载到 ID 为 1 的 AppDomain 的“LoadFrom”绑定上下文中。
VS调试程序运行中提示“显示名为“xxx.XmlSerializers”的程序集未能加载到 ID 为 1 的 AppDomain 的“LoadFrom”绑定上下文中.错误的原因为: System.IO ...
- 【C#进阶系列】23 程序集加载和反射
程序集加载 程序集加载,CLR使用System.Reflection.Assembly.Load静态方法,当然这个方法我们自己也可以显式调用. 还有一个Assembly.LoadFrom方法加载指定路 ...
- 重温CLR(十七)程序集加载和反射
本章主要讨论在编译时对一个类型一无所知的情况下,如何在运行时发现类型的信息.创建类型的实例以及访问类型的成员.可利用本章讲述的内容创建动态可扩展应用程序. 反射使用的典型场景一般是由一家公司创建宿主应 ...
- 类的加载到反射reflect
类的加载: 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载.连接.初始化这三个步骤来实现对这个类进行初始化. 加载: 就是指将class文件加载进入内存,并为之创建一个Class对 ...
随机推荐
- python开发_python中的module
在python中,我们可以把一些功能模块化,就有一点类似于java中,把一些功能相关或者相同的代码放到一起,这样我们需要用的时候,就可以直接调用了 这样做的好处: 1,只要写好了一个功能模块,就可以在 ...
- 证件照制作:使用PS打印一寸照片
1. 打开文件,文件-打开-选择要操作的图片: 2. 修改图片尺寸,图像-图像大小,弹出对话框后,设置 宽度:2.5cm,高度:3.5cm,分辨率:300 像素/英寸: 3. 为要打印的照片设置白边, ...
- Python实践练习:多重剪贴板
题目 假定你有一个无聊的任务,要填充一个网页或软件中的许多表格,其中包含一些文本字段.剪贴板让你不必一次又一次输入同样的文本,但剪贴板上一次只有一个内容.如果你有几段不同的文本需要拷贝粘贴,就不得不一 ...
- Asp.net 的工作原理
转:http://www.cnblogs.com/linjiancun/archive/2010/09/14/1825662.html 1.1.1 Asp.net 的工作原理 ...
- 动态修改datagrid中的numberbox的最大值和最小值
注意datagrid使用的触发函数是: onBeginEdit,只有在这个触发条件下,editor才真正初始化完成,不然没法动态修改numberbox中的最大最小值. 示例代码:(注意这一块:onBe ...
- Spring PropertyPlaceholderConfigurer占位符用法
1.PropertyPlaceholderConfigurer是一个bean工厂后置处理器的实现,也就是BeanFactoryPostProcessor接口的一个实现.PropertyPlacehol ...
- linux: cmake(未完,待更新)
参考: http://blog.csdn.net/netnote/article/details/4051620 http://blog.csdn.net/fan_hai_ping/article/d ...
- Ajax工作原理和原生JS的ajax封装
前言: 之所以用ajax作为博客的开篇,是因为无论从ajax的出现还是从它的作用上来说,ajax对于前端无疑是意义重大的.甚至可以说,是ajax带来了前端这个行业.当然,历史并不能说明当下,曾经的辉煌 ...
- UNITY调用安桌方法出现 JNI: Init'd AndroidJavaClass with null ptr!
UNITY调用安桌方法出现 JNI: Init'd AndroidJavaClass with null ptr! 原因是····· 得运行在一个真正的Android设备上! 得运行在一个真正的And ...
- C 预处理小结
预处理功能主要包括宏定义,文件包含,条件编译三部分.分别对应宏定义命令,文件包含命令,条件编译命令三部分实现. 预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并对源代码进行响应的转换.预处理 ...