我们在用Visual Studio进行开发的时候,经常会跟dll或者exe的文件打交道,懂一点计算机的同学会想,dll文件里面存的应该是二进制吧,它不能直接运行,不过可以被exe的程序调用。懂点.Net的同学:哦,原来dll文件中存放的是经过编译后的MSIL,运行时,它会由一个叫JIT的编译器再编译为适合本地运行的二进制,供程序运行。那么今天,作为懂得不是一点点的我们,就应该了解这里面到底是些什么东西,这样会更好的理解.Net框架。已经不记得是在哪里记下的哪位大神笔记,贴在自家墙上的,如今拿出来晒晒,只为跟众多园友们分享分享!
如图所示:
在.Net Framework下,一个dll/exe文件也叫一个程序集,可以把它看作是一个程序的集合,因为程序要运行,除了必要的代码以外,可能牵扯到相关的图像,视频等等,而程序集,就是这些东西了一个集合。
下面对图中的名词一一介绍:
PE/COFF:Windows 操作系统能加载并执行.dll和.exe文件,是因为它能够理解PE/COFF格式.PE/COFF( Micorsoft Windows Protable Executable/Commom Object File Format )——可移植可执行/通用对象文件格式。PE/COFF头包含了供操作系统查看和利用的信息,如文件指针等等。
CLR 头:程序集中包含的CLR代码,并不是计算机可以直接运行的,还需要进行即时编译。所以,需要将编译环境运行起来,因此,PE/COFF之后就是CLR头,告诉操作系统这个文件是一个.Net程序集,区别与其他类型的可执行程序。
清单:相当于一个目录,描述了程序集本身的信息,如程序集标识(版本号,名称等),资源(Resources),组成文件。
元数据:描述了程序集所包含的内容,包括:程序集包含的模块、类型、成员、可见性等。注意:元数据并不包含类型的实现,类似于C/C++中的.h头文件,在.Net中查看元数据的过程就叫“反射”。
CIL代码:元数据中类型的实现,包括方法体、字段等,类似于C++中的.cpp文件。
资源文件:如音乐,图片等。