c# 深入探索之CLR

概念:

CLR :

公共语言运行时(Common Language Runtime) 是一个可由多种编程语言使用的"运行时",它负责资源管理(内存分配和垃圾收集等),并保证应用和底层操作系统之间必要的分离。CLR的核心功能(内存管理、程序集加载、安全性、异常处理和线程同步)可由面向CLR的所有语言使用。

通俗一点说就是:不管是c# 、c++、 vb、f#、甚至是java等各编译器面向CLR的语言,都可以借用CLR里已经实现的核心功能。

例如:CLR使用异常报告错误,因此,面向它的任何语言都能通过异常来报告错误;CLR允许创建线程,所以面向它的任何语言都能创建线程

 

托管模块

用支持CLR的任何一种语言创建的源代码文件,再经过相应的编译器检查语法和分析源代码,编译生成。

       是一个标准的32位的可移植执行体(PE32)文件或一个标准的64位可移植执行体(PE32+)文件,它们都需要CLR才能执行。下图:是将源代码编译成托管模块的过程

       

                                           

          托管模块的组成:

 

                              

以上是关于托管模块高大上版本的介绍,以下我再接地气的以C#语言作为主角介绍以下

 

    程序员写完一段优美的c#代码后,会通过自带的编译器编译,生成托管模块,托管模块在一个可移植的PE文件中(如 .exe 、.dll)

               PE文件里的托管模块,你可以当做c#的一个类,类里有四个属性,一个PE头(介绍该文件的信息),一个CLR头(描述这个对象的整体的一些信息,比如main入口),元数据(这个很关键,一种元数据表包含源代码中定义的那些那些类型和成员的描述信息,另一种包含引用的类型和成员的描述信息),IL代码(也很关键:就是你的源代码被编译后的代码,又称中间语言)。

    托管模块的主要组成就是IL与元数据:  IL代码有时候也叫托管代码,因为CLR管理它的执行  元数据就是对这段c#源代码的描述

    元数据有很多用途:其中有一条大家肯定晓得: Microsoft Visual Studio 用元数据帮助你写代码。“智能感知”(IntelliSense)技术会解析元数据,告诉你一个类型提供了那些方法、属性、事件和字段。对于方法,还能告诉你需要的参数

 

 托管模块可合并成为程序集

 

程序集(assembly)是一个抽象概念:

由一或者多个模块/资源文件的逻辑性组合。程序集是重用、安全性以及版本控制的最小单元。在CLR世界中,程序集相当于“组件”。托管模块合并程序集如下图

                            

    该图将 一些托管模块 与 一些资源文件 交给一个工具处理,生成一个PE32(+)文件,这些托管模块与资源文件合并到了一起,并多了一个清单(清单的作用类似于元数据对托管代码的作用)。

  

  执行程序集

      程序集同时包含 元数据与IL。IL是与CPU不相关的代码,不是机器语言,计算机无法运行,这个时候就需要强大的CLR了!

 

posted @ 2019-03-21 15:44  天下!行  阅读(2629)  评论(0编辑  收藏  举报