以前面试包括自己学习的时候经常会碰到这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、程序集、反射和控制反转的更多相关文章

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

    搬家进程中反射实现控制反转,样做的好处是可以通过配置项动态的控制下面那个类的属性 1.$this->getObject($class, $config->getConfig('param' ...

  2. C#通过反射实现简单的控制反转和依赖注入(一)

    Java项目中通过@Autowire便可以实现将对象实例化到指定的字段,无需手动new一个对象出来,用起来非常方便,因为Java类加载器在在加载过程会将扫描所有@Servie.@Mapper.@Com ...

  3. [.net 面向对象程序设计深入](26)实战设计模式——使用Ioc模式(控制反转或依赖注入)实现松散耦合设计(1)

    [.net 面向对象程序设计深入](26)实战设计模式——使用IoC模式(控制反转或依赖注入)实现松散耦合设计(1) 1,关于IOC模式 先看一些名词含义: IOC: Inversion of con ...

  4. [.net 面向对象程序设计深入](31)实战设计模式——使用Ioc模式(控制反转或依赖注入)实现松散耦合设计(1)

    [.net 面向对象程序设计深入](31)实战设计模式——使用IoC模式(控制反转或依赖注入)实现松散耦合设计(1) 1,关于IOC模式 先看一些名词含义: IOC: Inversion of con ...

  5. 【AutoFac】依赖注入和控制反转的使用

    在开始之前首先解释一下我认为的依赖注入和控制反转的意思.(新手理解,哪里说得不正确还请指正和见谅) 控制反转:我们向IOC容器发出获取一个对象实例的一个请求,IOC容器便把这个对象实例“注入”到我们的 ...

  6. C#设计模式之控制反转即依赖注入-Spring.NET

    主流的依赖注入方案:微软企业库中的Unity.Spring.NET.StructureMap.Ninject.Castle Windsor等等. 本章用简单的案例讲解 Spring.NET IOC-控 ...

  7. C#代码实现IoC(控制反转)设计,以及我对IoC的理解

    一. 什么是IoC 当在A类中要使用B类的时候,我们一般都是采用new的方式来实例化B类,这样一来这两个类就有很强的依赖关系,不符合低耦合的设计思想.这时候我们可以通过一个中间容器来实例化对象,需要的 ...

  8. 依赖倒置原则(DIP)、控制反转(IoC)、依赖注入(DI)(C#)

    理解: 依赖倒置原则(DIP)主程序要依赖于抽象接口,不要依赖于具体实现.高层模块不应该依赖底层模块,两个都应该以来抽象.抽象不应该依赖细节,细节应该依赖抽象.(具体看我上一篇贴子) 依赖倒置原则是六 ...

  9. 浅谈(IOC)依赖注入与控制反转(DI)

    前言:参考了百度文献和https://www.cnblogs.com/liuqifeng/p/11077592.html以及http://www.cnblogs.com/leoo2sk/archive ...

随机推荐

  1. Android性能优化之界面UI篇

    1.使用style.color.string.dimen样式来分离xml布局文件,减少代码的重复使用,增加代码复用率,防止hardcode,下面是一个例子: 在定义layout时候,因为每个View或 ...

  2. Android中处理大图片时图片压缩

    1.BitmapFactory.Options中的属性 在进行图片压缩时,是通过设置BitmapFactory.Options的一些值来改变图片的属性的,下面我们来看看BitmapFactory.Op ...

  3. DES

     本文对DES的介绍部分摘自博文DES加密算法的C++实现,具体实现则由自己完成. 另外,DES的官方文档链接见这里,在维基百科上也有比较详细的介绍.不过,DES已经被证明是不安全的(可见于RSA公司 ...

  4. Linux常见压缩命令 - gzip,zcat,bzip2,bzcat

    几个常见的压缩文件扩展名 *.Z compress 程序压缩的文件: *.gz gzip 程序压缩的文件: *.bz2 bzip2 程序压缩的文件: *.tar tar 程序打包的数据,并没有压缩过: ...

  5. objc:NSDateFormatter使用备忘

    NSDateFormatter类的实例可以将字符串的日期表示转换为NSDate对象或者反向转换. 如果只要显示日期不需要时间,则可以用-setDateStyle方法来设置显示日期的格式,有以下几种: ...

  6. How to configure ODBC DSN in Client to access remote DB2 for Windows

      How to configure ODBC DSN in Client to access remote DB2 for Windows MA Gen feng (Guangdong Unito ...

  7. C# Word转为多种格式文件(Word转XPS/SVG/EMF/EPUB/TIFF)

    一款有着强大的文档转换功能的工具,无论何时何地都会是现代办公环境极为需要的.在本篇文章中,将继续介绍关于Word文档的转换功能(Word转XPS/SVG/EMF/EPUB/TIFF)希望方法中的代码能 ...

  8. React Native入门 认识Flexbox布局

    Flexbox布局是由W3C在09年提出的在Web端取代CSS盒子模型的一种布局方式. ReactNative实现了Flexbox布局的大部分功能. Flexbox布局所使用的属性,基本可以分为两大类 ...

  9. TCP / IP,HTTP

    大学学习网络基础的时候老师讲过,网络由下往上分为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层.通过初步的了解,我知道IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用 ...

  10. JMS详细的工作原理

    如果手机只能进行实时通话,没有留言和短信功能会怎么样?一个电话打过来,正好没有来得及接上,那么这个电话要传递的信息肯定就收不到了.为什么不能先将信息存下来,当用户需要查看信息的时候再去获得信息呢?伴随 ...