.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对 ...
随机推荐
- PHP5 ini配置文件优化
1.1使用tmpfs作为缓存加速缓存的文件目录 [root@php-node1 ~]# mount -t tmpfs tmpfs /dev/shm/ -o size=256m [root@php-no ...
- vue-cli 自定义过滤器的使用
vue-cli 自定义过滤器的使用 vue2.0将内置过滤器去除,所以过滤器需要自己编写. Vue.js 允许你自定义过滤器,可被用作一些常见的文本格式化.过滤器可以用在两个地方:mustache 插 ...
- Python2处理字符集问题
这篇文章主要介绍了Python2.x中文乱码问题解决方法,本文解释问题原因.给出了处理办法并讲解了编码解码的一些知识,需要的朋友可以参考下 Python中乱码问题是一个很头痛的问题. 在Python3 ...
- [转载]用 FFMPEG 合并 MP4 视频
因为 ffmpeg 是支持切分 mp4 视频的,所以我就理所当然的以为 ffmpeg 是支持视频合并.直到今天同事找我问方法,才发现一直以为的方法是错误的, mp4 不支持直接 concate(丢人了 ...
- Android MVP模式简单易懂的介绍方式 (三)
Android MVP模式简单易懂的介绍方式 (一) Android MVP模式简单易懂的介绍方式 (二) Android MVP模式简单易懂的介绍方式 (三) 讲完M和P,接下来就要讲V了.View ...
- Linux 如何杀死僵尸进程
问题描述: shell > top top - :: up days, :, user, load average: 0.23, 0.81, 1.07 Tasks: total, running ...
- VNC Linux 远程桌面控制软件
简介: VNC (Virtual Network Computer)是虚拟网络计算机的缩写. VNC 是一款优秀的远程控制工具软件,VNC 是在基于 UNIX 和 Linux 操作系统的免费的开源软件 ...
- Pycharm 激活码 2019年1月9日16:57:13
K03CHKJCFT-eyJsaWNlbnNlSWQiOiJLMDNDSEtKQ0ZUIiwibGljZW5zZWVOYW1lIjoibnNzIDEwMDEiLCJhc3NpZ25lZU5hbWUiO ...
- git 撤销 merging
当我们在合代码的时候经常会遇到一些问题,这时候分支就处于merging状态,这时候可以用下面的命令撤销 $ git reset --hard HEAD (or sha_1) 不知道有没有更好的办法,希 ...
- Solo and Mute
[Solo and Mute ] Muting means a transition will be disabled. Soloed transtions are enabled and with ...