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模块失败导致应用程序启动异常
|
编译器 C# 图形学
Unity与 DLL文件 ☀️| 怎样使用VC++生成一个DLL文件并调用!(包括 在VS 中调用 和 在Unity中调用)
📢前言 🎬通过VC 生成DLL文件 🎥在VS中生成DLL文件 🏳️‍🌈第一步:新建一个dll项目 🏳️‍🌈第二步:新建一个`.h头文件`和`.cpp源文件` 🏳️‍🌈第三步:在`.h头文件`和`.cpp源文件`中编写代码 🏳️‍🌈第四步:生成dll和lib文件 🎥在VS中进行调用DLL文件 🚩第一步:先来新建一个项目 🚩第二步:复制firstDLLTest.dll和firstDLLTest.lib文件和上一个项目的头文件firstDLLTest.h 🚩第三步:在新项目里面添加C++代码 🚩第四步:添加头文件firstDLLTest.h和firstDLLTest.
Unity与 DLL文件 ☀️| 怎样使用VC++生成一个DLL文件并调用!(包括 在VS 中调用 和 在Unity中调用)
C#.Net 如何动态加载与卸载程序集(.dll或者.exe)6-----在不卸载程序域的前提下替换程序集文件。
原文:C#.Net 如何动态加载与卸载程序集(.dll或者.exe)6-----在不卸载程序域的前提下替换程序集文件。 当某个程序集文件被载入AppDomain,该文件在AppDomain.Unload之前是不能被替换和删除的。
2390 0
|
C# Windows C++
使用C#创建及调用WCF完整实例 (Windows服务宿主)
关于WCF的概念、原理、优缺点等,在这里就不多说了,网上很多,可以自行搜索,比我解释的要专业的多。 这里直接说使用Windows 服务(Windows Service)作为宿主如何实现,其它方式不在此次教程之内 文章最后有本例的下载连接,包含源代码、说明教程、编译后文件 实例环境:Window...
1835 0
|
Windows
Silverlight调用本机exe程序
要点: 1. Silverlight必须启用OOB模式,以及 Require elevated trust when running in-browser.参考下图设置 注:OOB模式,并不意味着必须脱离浏览器运行,仍然可以嵌入到网面中运行   2.
760 0