CLR寄宿(中) 托管exe文件的加载和执行

托管exe文件的加载和执行过程在之前的文章做过简要的介绍,现在结合本章的内容进行详细的分析。

托管exe文件被启动的时候,首先被PE Loader载入。PE Loader载入exe文件之后,会分析PE文件头的data directory table,如果CLR_Header内的值不为0,表示该文件是托管PE文件,PE Loader 会立即载入 MsCorEE.dll,并且执行 MsCorEE.dll内的_CorExeMain()函数。

如果是Windows XP以前版本的操作系统(比如Windows 2000),当Windows 2000 的 Loader 将exe文件载入之后,会检查PE Header 的 data directory table,将Import Table 所记录的数据都载入内存,就是MsCorEE.dll。接着找出 PE header 内程序的入口点,并执行此处的代码。这是 x86 机器码,由编译器自动产生,只有一道指令 (6 bytes),为“FF 25 00 20 40 00”,翻译成 x86汇编语言就是“JMP DWORD PTR [402000]”,其中 0x00400000 是 exe文件的 image base,而 0x2000 是 import address table 的 RVA (此处是_CorExeMain() 的偏移地址),所以执行“JMP DWORD PTR [402000]”的结果会跳到 MsCorEE.dll 的 _CorExeMain()。

在执行_CorExeMain()之后,其中的代码首先判断需要载入的CLR版本。

CLR启动之后,接下来要做的就是初始化工作,为托管程序建立进程,申请内存空间,建立线程池和应用程序域。第一个建立的应用程序域被称为Default AppDomain。

初始化之后,要载入MsCorLib.dll组件和其中的模块。

模块载入之后,会调用class loader 来载入 MsCorLib 内相关的 class。载入的 class 顺序依次为:

1) System.Object

2) System.ICloneable

3) System.Collections.IEnumerable

4) ……

5) System.AppDomain

6) System.LoaderOptimization

7) System.Runtime.Remoting.Proxies.__TransparentProxy

注意 此时并未载入 MsCorLib 内全部的 class,只载入目前需要的 class。

载入class之后,CLR会生成主线程,生成主线程又需要载入以下的类:

System.Threading.Monitor

System.IAppDomainSetup

System.AppDomainSetup

System.Char

System.Runtime.InteropServices.RuntimeEnvironment

System.RuntimeFieldHandle

System.Runtime.CompilerServices.RuntimeHelpers

System.Environment

主线程生成之后就是载入应用程序的组件到应用程序域,之后才真正进入应用程序的主函数。

进入Main()函数之后,会调用JIT编译器将IL代码编译成本地代码执行。

作者:玄魂

出处:http://www.cnblogs.com/xuanhun/

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/net/

时间: 2024-12-25 08:54:57

CLR寄宿(中) 托管exe文件的加载和执行的相关文章

请问怎么在程序中以对话框的形式加载另一个exe程序

问题描述 请问怎么在程序中以对话框的形式加载另一个exe程序 请问怎么在程序中以对话框的形式加载另一个exe程序,同时怎么把这个程序中的数据发送到那个程序里,谢谢 解决方案 用shellexecute载入你的程序,用setparent设置程序的父窗体为你的窗体. 解决方案二: 用这个java为例子吧 首先你要做这个swing界面的对话框 (不会可以看看对话框打开的方法 swing ) 第二部你然后通过对话框去选择你的exe程序 这个时候把这个exe当文件看待 第三步是重点了: 如何执行程序 Ru

PHP中的use关键字及文件的加载详解_php技巧

前言 可能在大家经常使用框架,写一个Controller或者Model的时候,写了好多use,但是并没有写文件加载的代码,就以为use可以进行文件的自动加载了. 详细介绍 其实,现在流行的php框架,都是基于MVC模式的,大量的使用了命名空间,以提高程序的灵活性.那么框架是怎么实现将use关键字所声明的类库对应的脚本文件进行加载的那? (1):在通过use关键字进行声明类库的声明的时候,并不会进行脚本的加载,而是在脚本文件真正使用到所对应的类库的时候才会进行加载(这就是所谓延迟加载). (2):

PHP中的use关键字及文件的加载详解

可能在大家经常使用框架,写一个Controller或者Model的时候,写了好多use,但是并没有写文件加载的代码,就以为use可以进行文件的自动加载了. 详细介绍 其实,现在流行的php框架,都是基于MVC模式的,大量的使用了命名空间,以提高程序的灵活性.那么框架是怎么实现将use关键字所声明的类库对应的脚本文件进行加载的那? (1):在通过use关键字进行声明类库的声明的时候,并不会进行脚本的加载,而是在脚本文件真正使用到所对应的类库的时候才会进行加载(这就是所谓延迟加载). (2):框架一

求助啊 如何用process定位并打开VB.EXE所在文件夹中的.exe文件,该文件的位置在不同电脑上是不固定的

问题描述 求助啊如何用process定位并打开VB.EXE所在文件夹中的.exe文件,该文件的位置在不同电脑上是不固定的 解决方案 解决方案二:你可以做个窗口,让用户选择路径,然后把路径保存到文件.这是最简单的办法.复杂一点,你就遍历磁盘,找到VB所在的文件夹,然后写入文件.下次打开,发现文件里有路径,就不再遍历了.解决方案三:谢谢谢谢能不能直接定位该程序位置比如以下语句:DimFilePathAsNewSystem.IO.StreamWriter(AppDomain.CurrentDomain

java调用swt.jar包dll文件的加载问题?

问题描述 java调用swt.jar包dll文件的加载问题? 调用swt.jar时,报错 Exception in thread "AWT-EventQueue-2" java.lang.UnsatisfiedLinkError: no swt-win32-3347 or swt-win32 in swt.library.path, java.library.path or the jar file at org.eclipse.swt.internal.Library.loadLib

Word 2013中启用或禁用Office加载项的方法

Office加载项是Office程序为了完成某种功能而需要在启动程序时自动加载的模块,例如书法字帖功能.稿纸功能.制作信封功能等.用户可以根据工作需要启用或禁用Office加载项,以提高Office程序的运行效率. 在Word2013中启用或禁用Office加载项的步骤如下所述: 第1步,打开Word2013文档窗口,依次单击"文件"→"选项"按钮,如图2013072559所示. 图2013072559 单击"选项"按钮 第2步,打开"

在Word 2010中启用或禁用Office加载项

Office加载项是Office程序为了完成某种功能而需要在启动程序时自动加载的模块,例如书法字帖功能.稿纸功能.制作信 封功能等.用户可以根据工作需要启用或禁用Office加载项,以提高Office程序的运行效率. 在Word 2010中启用或禁用Office加载项的步骤如下所述: 第1步,打开Word 2010文档窗口,依次单击"文件"→"选项"按钮,如图2012030301所示. 图2012030301 单 击"选项"按钮 第2步,打开&q

怎么在Word2010中启用或禁用Office加载项

Office加载项是Office程序为了完成某种功能而需要在启动程序时自动加载的模块,例如书法字帖功能.稿纸功能.制作信封功能等.用户可以根据工作需要启用或禁用Office加载项,以提高Office程序的运行效率. 在Word2010中启用或禁用Office加载项的步骤如下所述: 第1步,打开Word2010文档窗口,依次单击"文件"→"选项"按钮,如图1所示. 图1 单击"选项"按钮 第2步,打开"Word选项"对话框,切换

Office2003关闭启动文件夹加载项

当您启动 Word 时,Word 将自动加载模板和加载项位于启动文件夹中.在 Word 中的问题可能是冲突或问题造成的与外接程序.要确定问题是否由 startup 文件夹中的项目引起,请暂时关闭指向这些加载项的注册表设置. 在启动 Word 时再次以典型方式 (不使用支持模板),而无需外接程序在启动文件夹中启动 Word 操作步骤: 若要暂时关闭启动文件夹加载宏,请按照下列步骤操作: 退出所有 Office 程序. 双击桌面上的支持模板快捷方式. 在支持模板中,单击疑难解答工具. 在Micros