外的信 息。因此,程序集的部署要比非托管组件的部署 容易得多。
1.3加载公共语言运行时 1.3加载公共语言运行时
一个程序集或者是一个可执行应用程序,或者是一个包含 供可执行应用程序使用的一组类型(组件)的DLL。 供可执行应用程序使用的一组类型(组件)的DLL。 CLR负责管理包含在程序集中的代码的执行。这意味着宿 CLR负责管理包含在程序集中的代码的执行。这意味着宿 主机器必须安装.net框架。微软已经创建了一个可以将.net 主机器必须安装.net框架。微软已经创建了一个可以将.net 框架免费安装到客户机上的分发包。.net框架最终会和将 框架
免费安装到客户机上的分发包。.net框架最终会和将 来的Windows打包在一起,这样我们就不需要将它和我们 来的Windows打包在一起,这样我们就不需要将它和我们 的程序集放在一起来发布了。
我们可以通过在%windir%\system32目录下查找 我们可以通过在%windir%\system32目录下查找 MSCorEE.dll( MSCorEE.dll(Microsoft .NET Runtime Execution Engine)文件来判断一个机器中是否安装了.
NET Engine)文件来判断一个机器中是否安装了.NET 框架。如果想确定一个机器中安装了哪些版本 的.NET框架,可以查看下面的
注册表键的子键: .NET框架,可以查看下面的注册表键的子键: regedit HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ .NETFramework \ policy
当生成一个EXE程序集时,编译器/链接器会产生一些特 当生成一个EXE程序集时,编译器/链接器会产生一些特 殊的信息,并将它们嵌入到结果程序集的PE文件表头
及其 殊的信息,并将它们嵌入到结果
程序集的PE文件表头及其 各个组成文件的.text部分。当EXE文件被调用时,这些特 各个组成文件的.text部分。当EXE文件被调用时,这些特 殊的信息将导致CLR被加载并初始化。CLR随后会定位至 殊的信息将导致CLR被加载并初始化。CLR随后会定位至 应胜程序的入口点方法,从面以此来启动应用程序。 类似地,如果是一个非托管应用程序通过调用LoadLibrary 类似地,如果是一个非托管应用程序通过调用LoadLibrary 来加载一个托管程序集,那么该托管程序集DLL的入口点 来加载一个托管程序集,那么该托管程序集DLL的入口点 函数也会知道去加载CLR来处理包含在其中的代码。 函数也会知道去加载CLR来处理包含在其中的代码。
托管EXE加载并初始化CLR的过程 托管EXE加载并初始化CLR的过程 1. MSCorEE检查CLR表头以获得Main方法的元数据标记。 MSCorEE检查CLR表头以获得Main方法的元数据标记。 2. MSCorEE 检查Main方法的元数据以获得其IL在托管EXE中的位置。 检查Main方法的元数据以获得其IL在托管EXE中的位置。 3. MSCorEE 将Main方法的IL编译成本地CPU指令。 Main方法的IL编译成本地CPU指令。 4. MSCorEE跳转到Main方法编译后的本地CPU指令上(使用主线程) MSCorEE跳转到Main方法编译后的本地CPU指令上(使用主线程) 5. 应用程序开始运行。
1.4执行程序集代码 1.4执行程序集代码
托管模块中包含着元数据和IL代码。IL是由微软 托管模块中包含着元数据和IL代码。IL是由微软 在咨询了一些商业和学术上的语言编译器作者之 后开发的一种独立于CPU的机器语言。IL要比大 后开发的一种独立于CPU的机器语言。IL要比大 多数CPU机器语言高级得多,它可以理解对象类 多数CPU机器语言高级得多,它可以理解对象类 型,并且拥有很多高级的指令,这些指令可以创 建和初始化对象,调用对像上的虚方法以直接操 作数组元素。它甚至还有抛出和捕获异常的指令。 我们可以把IL视 我们可以把IL视 作一种面向对像的机器语言。
通常情况上,开发人员会使用一门高级语言,比 如:C#或 如:C#或Visual Basic)。这些语言的编译器産的将 Basic)。这些语