托管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代码编译成本地代码执行。

原地址链接:https://www.cnblogs.com/xuanhun/archive/2012/06/23/2559351.html

托管exe文件的加载和执行的更多相关文章

  1. JavaScript 的性能优化:加载和执行

    随着 Web2.0 技术的不断推广,越来越多的应用使用 javascript 技术在客户端进行处理,从而使 JavaScript 在浏览器中的性能成为开发者所面临的最重要的可用性问题.而这个问题又因 ...

  2. [转]JavaScript 的性能优化:加载和执行

    原文链接:http://www.ibm.com/developerworks/cn/web/1308_caiys_jsload/index.html?ca=drs- JavaScript 的性能优化: ...

  3. JavaScript的性能优化:加载和执行

    随着 Web2.0 技术的不断推广,越来越多的应用使用 javascript 技术在客户端进行处理,从而使 JavaScript 在浏览器中的性能成为开发者所面临的最重要的可用性问题.而这个问题又因 ...

  4. 【转】js JavaScript 的性能优化:加载和执行

    JavaScript 的性能优化:加载和执行 转自:https://www.ibm.com/developerworks/cn/web/1308_caiys_jsload/ 随着 Web2.0 技术的 ...

  5. C#动态编译代码,执行一个代码片段,或者从指定文件中加载某个接口的实现类

    在项目进行中有时候会需要配置一些复杂的表达式,在程序运行的时候执行表达式,根据结果执行相应的操作,简单写了一个类Expression,利用.net的动态编译技术实现,代码如下: public clas ...

  6. 使用getScript()方法异步加载并执行js文件

    使用getScript()方法异步加载并执行js文件 使用getScript()方法异步请求并执行服务器中的JavaScript格式的文件,它的调用格式如下所示: jQuery.getScript(u ...

  7. 动态加载JS文件,并根据JS文件的加载状态来执行自己的回调函数

    动态加载JS文件,并根据JS文件的加载状态来执行自己的回调函数, 在很多场景下,我们需要在动态加载JS文件的时候,根据加载的状态来进行后续的操作,需要在JS加载成功后,执行另一方法,这个方法是依托在加 ...

  8. C#.Net 如何动态加载与卸载程序集(.dll或者.exe)3---- 动态加载Assembly应用程序

    下载 supergraphfiles.exe 示例文件. 应用程序体系结构 在我专攻代码之前,我想谈谈我尝试做的事.您可能记得,SuperGraph 让您从函数列表中进行选择.我希望能够在具体的目录中 ...

  9. java笔记——java加载与执行

    java的加载与执行过程: 编译阶段: 首先,我们先创建一个java源文件xxx.java 2. 经过javac.exe编译(如果源文件没有语法错误),生成一个或多个.class文件,注意的是此时的字 ...

随机推荐

  1. 【Leetcode链表】分隔链表(86)

    题目 给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前. 你应当保留两个分区中每个节点的初始相对位置. 示例: 输入: head = 1->4 ...

  2. zabbix概述篇

    zabbix监控系统概述 监控系统 决不允许未经监控的业务和服务的上线 基本功能 采样:获取客户端数据(主动和被动模式) 存储 展示 告警 监控通道 ssh/telnet:无agent snmp:简单 ...

  3. SharePoint开发中怎样使用Visual Studio给你的Web Part加入图标

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u012025054/article/details/36051545 SharePoint开发中怎样 ...

  4. KiCad EDA 画圆弧

    KiCad EDA 画圆弧 看起来像是成功了. KiCad 画圆弧一直没有完善解决,但是 KiCad 一直有在努力.

  5. ssh 出错 Permission denied (publickey,password).

    将客户端的~/.ssh/know_hosts 文件删掉试试 ssh debug信息 ssh -vvv xxx@192.168.1.111

  6. 快速完成智能数据构建,Dataphin公共云版本全面解读

    公测两个月,Dataphin公共云版本已经受到了阿里云上众多轻量级用户的关注.事实上,Dataphin作为一款大数据智能构建与管理的产品,其核心功能是面向各行各业大数据建设.管理及应用诉求,一站式提供 ...

  7. Redis源码解析:03字典

    字典是一种用于保存键值对(key value pair)的抽象数据结构.在字典中,一个键和一个值进行关联,就是所谓的键值对.字典中的每个键都是独一无二的,可以根据键查找.更新值,或者删除整个键值对等等 ...

  8. H3C-PPPOE

    --------------pppoe拨号V7------------------------------- dialer-group 10 rule ip permit interface Dial ...

  9. Timer更新UI的合理办法

    using System; using System.Windows; using System.Timers; using System.Windows.Threading; namespace T ...

  10. SuperSocket 服务器管理器客户端

    SuperSocket 服务器管理器当前有两种类型的客户端, Silverlight客户端和WPF客户端.这两种客户端的代码都在源代码中的"Management"目录,你可以自行编 ...