CLR执行模式之托管代码程序集浅析

     
 CLR即公共语言运行时,是一个可是由余编程语言应用的‘运行时’,其中心作用(内存管理,程序集加载,安全性,异常处理与线程同步等)均只是由面向CLR的有着语言应用。运行时不必关心开发人员用啊一样种语言写源代码,只要编译器是面向CLR的。

     
 通过言语对应之编译器检查语法和分析源码编译生成某些托管模块(PE32或PE32+)通过数据实施保护(DEP)和地方空间布局随机化(ASLR)增强全体体系的安全性。接下来详说其关键有:

  • PE32或PE32+:标准Windows
    PE文件头(一栽格式),使用PE32格式文件能以Win32各或64各本及运行,使用PE32+只会于64个上运行。其标识了文件类型对于只有含IL代码的模块PE32(+)头之绝大多数音会被忽视,如果含有本机CPU代码的模块,这个腔包含与本机CPU代码有关的信。
  • CLR头:包含是此模块成为托管模块的消息(要求的CLR版本,一些标志,托管模块入口计的头条数据和模块的首家数据,资源大称,一些标志以及其它非极端重大之数额项的位置)
  • 首位数据:每个托管模块都富含元数据表。主要发生少数种植,一种植描述源代码中定义之花色及分子,另一样栽描述源代码引用的种和分子。
  • IL(中间语言)代码:编译器编译源代码时别的代码,在运转时拿IL编译成本机CPU指令。

简而言之的话一样种植格式标准为那变为同种模块,模块中元数据实际上就是数据表的集,用以关联IL代码文件可以视为同步的。

      元数据的在有那么些用场:

  • 编译器直接从托管模块读取元数据,避免对原生C/C++头和仓库文件之急需。
  • 帮扶你写代码(智能感知技术)
  • CLR代码验证过程用初数据确保代码只实行“类型安全”的操作。
  • 兴将目标的字段序列化到内存块,将那个发送给其它一样台机械,然后反序列化在长距离机器上重建对象状态
  • 渣回收器的落实  

CLR其实不与模块工作,通常以一个或多个模块/资源文件逻辑性分结合程序集(抽象概念,是选用,安全性与版本控制的顶小单元,相当给组件)。编译器默认将变的托管模块转换成程序集,C#编译器生成的凡包含清单的托管模块,清单指出程序集才出于一个文件构成。所以对于只有来一个托管模块且无资源文件之色,程序集就是托管模块。在程序集的模块中,包含于援的顺序集有关的音,这些信要程序集能够从描述(C#经过长数据来叙述自己,当尽代码时,运行库将首数据加载到内存,并引用他来发现有关代码的近乎成员等信息)。程序集吧逻辑表示和物理表示区分开,便于安排文件节省空间缩短安装时间。