Clr Via C#读书笔记---程序集的加载和反射
#1 加载程序集
Assembly.Load:
public class Assembly
{
public static Assembly Load(AssemblyName assemblyRef);
public static Assembly Load(String assemblyString);
}
在内部,Load导致CLR向应用程序集应用一个版本绑定重定向策略,并在GAC中查找程序集。如果传递的是一个弱命名程序集,不会应用版本绑定重定向策略,也不会去GAC中查找程序集。
AppDomain.Load:
public class AppDomain
{
public Assembly Load(String assemblyString);
}
AppDomain.Load 是一个实例方法,为了加载程序集,CLR将使用与指定AppDomain关联的设置,而不是与发出调用的那个AppDomain相关联的设置。一般要避免使用。
Assembly.LoadFrom:
public class Assembly
{
public static Assembly LoadFrom(String path);
}
在内部,AssemblyName.GetAssemblyName(String assemblyName)-->Assembly.Load(AssemblyName assemblyRef); 然后CLR应用版本绑定重定向策略。LoadFrom允许传递一个URL作为实参,例:
Assembly a = Assembly.LoadFrom(@"http://wintellect.com/SomeAssembly.dll");
Assembly.LoadFile:
public class Assembly
{
public static Assembly LoadFile(String path);
}
LoadFile可以从任意路径加载一个程序集,CLR不会自动解析任何依赖性问题。需要通过AssemblyResolve事件登记,让回调方法显示加载依赖的程序集。
Assembly.ReflectionOnlyLoadFrom & Assembly.ReflectionOnlyLoad:
public class Assembly
{
public static Assembly ReflectionOnlyLoadFrom(String assemblyFile);
public static Assembly ReflectionOnlyLoad(String assemblyString);
}
ReflectionOnlyLoadFrom加载路径指定文件,不会获取强名称,也不会再GAC和其他位置搜索文件;
ReflectionOnlyLoad会在GAC、应用程序基目录、私有路径和codebase指定位置搜索程序集,但不会应用版本控制策略。加载哪个版本,获得的就是哪个版本。CLR禁止上边两种方式加载的程序集中的任何代码执行。
仅部署一个EXE文件的做法:对于添加的DLL,将其属性中的“生成操作”更改为“嵌入的资源”。运行时,CLR找不到依赖的DLL程序集,需要做如下处理。
#2 反射的应用
发现程序集中定义的类型:
类型对象的准确含义:
c#操作符(typeof),测试精确匹配;is/as操作符,测试的是兼容匹配(可以匹配派生对象)。
构建Exception派生类的一个实例:
#3 设计支持加载项的应用程序
#4 使用反射发现类型的成员
#5 发现类型的接口
Clr Via C#读书笔记---程序集的加载和反射的更多相关文章
- 【C#】解析C#程序集的加载和反射
目录结构: contents structure [+] 程序集 程序集的加载 发现程序集中的类型 反射对类型成员的常规操作 发现类型的成员 创建类型的实例 绑定句柄减少进程的内存消耗 解析自定义特性 ...
- .net 程序集的加载与反射
一. 程序集的加载: 在CLR内部使用System.Reflection.Assembly类的静态LoadFrom方法尝试加载程序集. LoadFrom方法在内部调用Assembly的Load方法,将 ...
- clr via c# 程序集加载和反射(2)
查看,clr via c# 程序集加载和反射(1) 8,发现类型的成员: 字段,构造器,方法,属性,事件,嵌套类型都可以作为类型成员.其包含在抽象类MemberInfo中,封装了所有类型都有的一组属性 ...
- clr via c# 程序集加载和反射集(一)
1,程序集加载---弱的程序集可以加载强签名的程序集,但是不可相反.否则引用会报错!(但是,反射是没问题的) //获取当前类的Assembly Assembly.GetEntryAssembly() ...
- thinkphp学习笔记9—自动加载
原文:thinkphp学习笔记9-自动加载 1.命名空间自动加载 在3.2版本中不需要手动加载类库文件,可以很方便的完成自动加载. 系统可以根据类的命名空间自动定位到类库文件,例如定义了一个类Org\ ...
- .net加载失败的程序集重新加载
在.net程序中,程序集是Lazy加载的,只有在用的时候才会去加载,当程序集加载失败时,会触发AppDomain.AssemblyResolve的事件,在这个事件中,我们甚至还可以进行补救,从别得地方 ...
- 显示名为“xxx.XmlSerializers”的程序集未能加载到 ID 为 1 的 AppDomain 的“LoadFrom”绑定上下文中。
VS调试程序运行中提示“显示名为“xxx.XmlSerializers”的程序集未能加载到 ID 为 1 的 AppDomain 的“LoadFrom”绑定上下文中.错误的原因为: System.IO ...
- Clr Via C#读书笔记---CLR寄宿和应用程序域
#1 CLR寄宿: 开发CLR时,Microsoft实际是将他实现成包含在一个dll中的COM服务器.Microsoft为CLR定义了一个标准的COM接口,并为该接口和COM服务器分配了GUID.安装 ...
- CLR via C#读书笔记一:CLR的执行模型
CLR(Common Language Runtime)公共语言进行时是一个可由多种编程语言使用的“进行时”. 将源代码编译成托管模块 可用支持CLR的任何语言创建源代码文件,然后用对应的编译器检查语 ...
随机推荐
- iOS开发——UI基础-按钮内边距,图片拉伸
一.内边距 UIButton有三个属性,分别可以设置按钮以及内部子控件的内边距 1.contentEdgeInsets 如果是设置contentEdgeInsets, 会把UIImageView和UI ...
- UOJ52——【UR #4】元旦激光炮
1.题目大意:就是给你三个数组啦,然后让你找到其中的第K大,但是,不可以直接访问数组,必须通过一种函数,最后的分数 是看调用几次这个函数,100次以内10分,2000以内6分.... 2.分析:最开始 ...
- hiho #1114 : 小Hi小Ho的惊天大作战:扫雷·一
#1114 : 小Hi小Ho的惊天大作战:扫雷·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 故事背景:密室.监视器与充满危机的广场 “我们还是循序渐进,先来考虑这 ...
- git 教程(6)--管理修改
现在,假定你已经完全掌握了暂存区的概念.下面,我们要讨论的就是,为什么Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件. 你会问,什么是修改?比如你新增了一行,这就是一个修改 ...
- caffe学习系列(2):训练和测试自己的图片
参考:http://www.cnblogs.com/denny402/p/5083300.html 上述主要介绍的是从自己的原始图片转为lmdb数据,再到训练.测试的整个流程(另外可参考薛开宇的笔记) ...
- TP中的四种url访问方式
什么是PATHINFO:就是http://localhost/index.php/Home/Index/index/a/1/b/2?c=3中的红色部分, 注意c=3并不是pathinfo的一部分,它是 ...
- 嵌套div中margin-top转移问题的解决办法
在这两个浏览器中,有两个嵌套关系的div,如果外层div的父元素padding值为0,那么内层div的margin-top或者margin-bottom的值会“转移”给外层div. <!DOCT ...
- kill新号专题
一.在tomcat启动脚本中看到,kill -3
- PHP设定错误和异常处理三函数
register_shutdown_function(array('Debug','fatalError')); //定义PHP程序执行完成后执行的函数 set_error_handler(array ...
- 76 binary_search 查找重复元素
[本文链接] http://www.cnblogs.com/hellogiser/p/binary-search-for-repeated-element.html [题目] 给定一个升序排列的自然数 ...