CLR执行模式之托管代码程序集浅析
程序员文章站
2022-04-10 12:48:16
CLR即公共语言运行时,是一个可由多种编程语言使用的‘运行时’,其核心功能(内存管理,程序集加载,安全性,异常处理和线程同步等)均可由面向CLR的所有语言使用。运行时不必关心开发人员用哪一种语言写源代码,只要编译器是面向CLR的。 通过语言对应的编译器检查语法和分析源码编译生成某些托管模块(PE32 ......
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#通过元数据来描述自身,当执行代码时,运行库将元数据加载到内存,并引用他来发现有关代码的类成员等信息)。程序集吧逻辑表示与物理表示区分开,便于部署文件节省空间缩短安装时间。