一、MSDN上的说明
托管执行过程包括下列步骤:
-
选择编译器。
为获得公共语言运行库提供的优点,必须使用一个或多个针对运行库的语言编译器。
-
将代码编译为 Microsoft 中间语言 (MSIL)。
编译将源代码翻译为 MSIL 并生成所需的元数据。
-
将 MSIL 编译为本机代码。
在执行时,实时 (JIT) 编译器将 MSIL 翻译为本机代码。在此编译过程中,代码必须通过验证过程,该过程检查 MSIL 和元数据以查看是否可以将代码确定为类型安全。
-
运行代码。
公共语言运行库提供使执行能够发生以及可在执行期间使用的各种服务的结构。
二、进一步说明
代码第一次编译形成IL中间语言的托管代码,在运行时被Class Loader装载后进行JIT第二次编译形成托管的本地代码。在执行过程中,它会不断地检查当前我们执行的代码的安全性和规范性。
Class Loader在装载可执行程序exe或者动态链接库dll的时候,它不是把所有的exe和dll当中的类库全部装载到内存里面。它是先装载一部分,即Main函数所在的文件,然后在执行过程中Class Loader会不断地判断当前执行过程中所要调用的方法是否已被装载到内存中了,如果没有,它会实时地去装载一些没有被装载的代码。装载进来之后,被编译为托管的本地代码,然后调用。
-----------------------------------------------------------------------------------------------------------------
程序集(Assemblies)
一个程序集是一组类型和资源的集合,共同组成一定的逻辑功能
包含一个类型或程序的清单(manifest),类型原数据,MSIL,资源
程序集清单描述了应用程序集里面都有哪些类型,这些程序都存放在什么地方。它规定了我的这些代码都在什么地方,可能在磁盘的某个位置,另外的一部分资源可能在Internet上。Manifest最终被Class Loader所用,Class Loader在动态加载类库的时候,就需要知道类库在哪个位置的哪个文件里。我们在编写应用程序的时候,实际上我们可以把程序集清单里面的Assembly的位置描述为在一个互联网上的Http地址,Class Loader在实时地加载这个类的时候它会从Http这个路径去加载远程服务器上的Library过来,这样就实现了零部署,我们不用在更新了Dll之后强迫客户端更新。
所有能够部署的单元都是编译过的MSIL(可执行的中间代码)
轻便的可执行文件(PE file)EXE或者是DLL
在.NET Framework程序在执行的时候,它有一个公共类型系统,这些公共类型系统的实现都在CLR里面。我们在运行程序的时候,使用到了大量的Framework中所定义好的类库,而客户端在执行应用程序的时候实际上已经安装了Framework,也就是说它已经帮我们在客户端部署了很多已经存在的功能。我们的程序在完成后,有很多类库不需要包装在我们的执行文件里面,我们只需要把执行文件放到客户端,去调用客户端的Framework里面的类库。这样我们编写的应用程序规模就很小,但它执行起来内存占用量比较大。
可以用ILDASM和反射(Reflection)来检查程序集
可以是单一的文件或多个文件