.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对 ...
随机推荐
- 指向“**js/shop.js”的 <script> 加载失败
指向“”的 <script> 加载失败 找了半天没找到原因 原来是meta里面的 csp Content-Security-Policy <meta http-equiv=" ...
- 在kindeditor 获取textarea 中 输入的值
要在kindeditor 获取textarea 中 输入的值 必须在kindeditor创建的时候添加下面红色字体的代码 kindeditor创建代码如下: var editor;KindEd ...
- FFmpeg库简介
1.FFmpeg基本组成 FFmpeg框架的基本组成包含AVFormat.AVCodec.AVFilter.AVDevice.AVUtils等模块库,如下图所示. libavformat:用于各种音视 ...
- python实战===python控制键盘鼠标:pynput
Python控制键盘鼠标:pynput 地址:https://pypi.python.org/pypi/pynput 这个库让你可以控制和监控输入设备. 对于每一种输入设备,它包含一个子包来控制和监控 ...
- Mule ESB 安装基本配置要求
Hardware Requirements* 2GHz, dual-core CPU, or 2 virtual CPUs in virtualized environments 2GB of RAM ...
- 二、SQL的生命周期
MySQL的sql语句由客户端发出,经过连接和权限验证后,最终达到服务器端,由服务器分配thread线程处理,之后就是要介绍的具体服务器端的thread线程是怎么处理每条sql语句的.[ 了解thre ...
- rsyslog收集nginx日志配置
rsyslog日志收集配置 rsyslog服务器收集各服务器的日志,并汇总,再由logstash处理 请查看上一篇文章 http://bbotte.blog.51cto.com/6205307/16 ...
- C# 基础连接已经关闭: 发送时发生错误
在程序中获取某个https网址的源码,GetRespose()时 出现了“基础连接已经关闭: 发送时发生错误.”的错误提示. 翻了论坛后,有个仁兄说: //.net 4 ...
- 1、设备网络SDK主要功能
图像预览.文件回放和下载,云台控制,布防/撤防,语音对讲,日志管理,解码卡,远程升级,远程重启/关闭,格式化硬盘,参数配置(系统配置,通道配置,串口配置,报警配置,用户配置),多路解码器,智能设备功能 ...
- Qt编译,imp_CommandLineToArgvW@8问题
Tested msvc2013. The linker can not find _imp_CommandLineToArgvW@8. It's in shell32.lib. I see qtmai ...