CLR,程序集反射和控制反转

Posted 国防部长

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CLR,程序集反射和控制反转相关的知识,希望对你有一定的参考价值。

    以前面试包括自己学习的时候经常会碰到这3个东西,也查过相关介绍,晦涩难懂,虽然看完之后,当时勉强理解,不过过一段时间又忘了。其实这篇文章可以分两篇(clr、程序集)和(反射、控制反转)来写,但它们之间有着内在的联系,我这里把它们放到一起学习,以便于自己的深入记忆和理解。最后也是希望大家关注一下原理的东西,不了解.Net Framewor怎么设计优秀的.net框架呢?多学多看多回顾,才能将知识点融会贯通。

CLR

  CLR(Common Language Runtime,简称CLR)通用语言运行时,它是.net框架的核心,意思就是可被各种不同语言所使用的运行时。vs的ide中有托管扩展C++,C#,VB等等,说明vs中集成了各种面向CLR的语言编译器。当我们用不同的语言编写代码时,编译器就会对应将我们的代码编译成面向CLR的代码。有什么好处呢,比如在数学和金融领域的应用中,在表达相同意图的情况下,Python将会比C#节省好几天时间。还有一些模块如果对性能有要求,C++编写的代码肯定会比C#快。

为了加深一下理解,可以看一下最近比较好的一篇博客,.net环境下跨进程、高频率读写数据。看完还可以顺便理解一下Redis。

程序集

   说程序集之前,先来了解一下什么是托管模块,通过前边介绍,我们可以通过任何支持CLR的编程语言来创建源代码文件,然后通过相应的编译器做代码检查和源代码分析,但是不管使用了何种的编译器,最后生成的结果都是一个托管模块(一种需要CLR才能执行的可移植可执行(p\'ortable executable简称PE)的文件),下图展示了将源代码编译成托管模块

                                          

  托管模块包含,PE表头、CLR表头、元数据和IL中间代码。这里详细介绍下元数据的用处,方便后边理解反射。

  元数据用处:

   1、元数据省去编译时对头文件和库文件的需求,因为含有类型和成员和中间代码已经包含所有被引用的类型和成员信息。编译器可以通过托管模块读取元数据来获得这些信息。

   2、可以利用元数据来辅助我们编写代码(某个类型提供哪些方法,某个方法有哪些参数)

   3、CLR的代码验证可以利用元数据来确保代码执行安全的操作。

   4、利用元数据,我们可以将一个对象的字段序列化到一个内存块中,然后远程传送到另外一台机器,最后在远程机器上执行反序列化,从而重新创建对象和它的状态

      (例如xml webservice)。

   5、利用元数据,垃圾收集器可以追踪对象的生存期。

CLR并不与托管模块打交道,它与程序集(exe或dll)打交道,于是编译器需将托管模块组合成程序集,如图所示:

                                       

反射

       理解反射之前,最好先写一下代码再来看此介绍,会很好的理解。元数据其实就一堆表,当我们生成程序集或者模块时,编译器会创建一个类型(Type)定义表、字段定义表、方法定义表等等;system.reflection命名空间的某些类型会使得我们能够编写代码来分析这些元数据(这其实就是反射),并为这些元数据建立对象模型,然后利用元数据的对象模型的类型,我们可以根据一个类型定义表得到他包含的所有类型,对于每一个类型 ,我们又可以获得他的基类型、它实现的接口和相关联的一些标记,还可以利用  system.reflection命名空间的类型来获取一个类型的字段、属性、方法和事件,而且可以获取元数据的定制特性(Attribute)。

控制反转

       这里建议看一下反射机制、依赖注入、控制反转这篇文章!写的挺好。后续有时间争取写一些反射和控制反转的实例代码,方便大家学习!!!

总结一下

       将不同的知识点串联起来学习,真的是一个很好的方式,鼓励大家多多学习,多多总结,早日成为大牛!!!

     

以上是关于CLR,程序集反射和控制反转的主要内容,如果未能解决你的问题,请参考以下文章

PHP依赖注入,控制反转,反射Ioc容器和服务提供者各个概念的理解和使用

PHP依赖注入,控制反转,反射Ioc容器和服务提供者各个概念的理解和使用

[PHP] 使用反射实现的控制反转

[转]Java Spring的Ioc控制反转Java反射原理

通过配置文件,反射,工厂模式实现IOC控制反转

Spring01-控制反转(IOC)与依赖注入(DI)