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

简介:

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/archive/2012/06/23/2559351.html,如需转载请自行联系原作者

相关文章
IIS加载uslresol.dll模块失败导致应用程序启动异常
IIS加载uslresol.dll模块失败导致应用程序启动异常
|
Windows
模块 DLL usrresol.dll 未能加载
IIS应用程序池自动关闭,模块DLL C:\windows\system32\inetsrv\urlresol.dll 未能加载
550 0
模块 DLL usrresol.dll 未能加载
C#.Net 如何动态加载与卸载程序集(.dll或者.exe)6-----在不卸载程序域的前提下替换程序集文件。
原文:C#.Net 如何动态加载与卸载程序集(.dll或者.exe)6-----在不卸载程序域的前提下替换程序集文件。 当某个程序集文件被载入AppDomain,该文件在AppDomain.Unload之前是不能被替换和删除的。
2373 0
|
Windows
Silverlight调用本机exe程序
要点: 1. Silverlight必须启用OOB模式,以及 Require elevated trust when running in-browser.参考下图设置 注:OOB模式,并不意味着必须脱离浏览器运行,仍然可以嵌入到网面中运行   2.
755 0
|
.NET C# Windows
[CLR via C#]1.3 加载公共语言运行时
原文:[CLR via C#]1.3 加载公共语言运行时 1. 你生成的每个程序集可以是EXE,也可以是DLL。最终都是有CLR管理这些程序集中代码的执行。 2. VS2010中,创建新的EXE项目时,默认平台是x86,而不是anycpu。
713 0