程序集加载和反射

程序集的加载

JIT编译器器将IL代码编译成本地代码时, 会查看IL代码中引用了哪些类型。在运行过程中,JIT编译器利用程序集的TypeRef和AssemblyRef元数据表来确定哪一个程序集定义了所引用的类型,然后JIT编译器将对应程序集加载到AppDomain中,在内部,CLR使用System.Reflection.Assembly类的静态方法Load来尝试加载一个程序集。然而如果我们想动态加载一个程序集时,可以使用Assembly的Load方法来动态加载程序集,其中Assembly类中还提供了其他的加载程序集方法,有LoadFrom(string path), LoadFile(stringassemblyFile)等,具体方法的使用和解释可以参照MSDN中的介绍:http://msdn.microsoft.com/zh-cn/library/xbe1wdx9

使用反射构建动态可拓展应用程序

元数据表是用一系列字段表,方法表,类型定义表组成的。可以利用System.Reflection命名空间中包含的类型,可以写代码来反射这些元数据表。具体的反射机制我是这样理解的:

  1. 首先应该清楚的了解到,System.Reflection命名空间中的类型为程序集或模块中包含的换数据表提供了一个对象模型
  2. 通过这个对象模型,我们就可以枚举出元数据表中的所有类型,针对这些类型,我们就可以获得它的基类型,实现的接口…甚至利用System.Reflection的其他类型,还可以解析对于的元数据表来查询的字段,方法,属性和事件。
  3. 事实上,只有少数类库需要了解类型的定义才能提供丰富的功能。才适合用反射

反射的性能

缺点:

  1. 由于反射严重依赖字符串,所以会丧失编译时的类型安全性.例如,执行Type.GetType(“int”),要求通过反射在程序集中查找名为“ int”的类型,代码会通过编译,但在运行时会返回null,因为CLR只知“System.Int32”不知“Int”。
  2. 反射速度很慢。使用反射的时候,类型和成员在编译的那个时候都是未知的;必须要用字符串名称标识每个类型及其成员,然后在运行的时候发现它们。
  3. 用反射调用成员也会影响性能。用反射调用方法时。首先必须将实参打包成数组在内部,反射还得将这些实参解包到线程栈上。

基于上述的缺点,我们可以用如下的方法:

  • 让类型从编译的基类型派生。在运行时构造派生类型的实例,将对它的引用放在基类型的变量中(利用转型),再调用基类型定义的方法
  • 让类型实现编译时已知的接口。理由同上

详细的可以浏览http://www.studyofnet.com/news/520.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值