托管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

转载于:https://www.cnblogs.com/wwkk/p/11481596.html

托管exe文件的加载和执行相关推荐

  1. EXE文件的加载过程

    一个microsoft的.exe程序文件的启动过程 2009-06-16 14:54 2101人阅读 评论(0) 收藏 举报 microsoftmfcwindowsshelldll数据结构 学习win ...

  2. (更新时间)2021年6月4日 商城高并发秒杀系统(.NET Core版) 30-lua文件封装加载和执行

    一:lua文件的作用 1.批量执行redis命令 2.保证redis命令能够原子执行 二:lua文件定义和使用 1.lua文件 --[[1.函数定义 ]]-- --1.单品限流 local funct ...

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

    概览 无论当前 JavaScript 代码是内嵌还是在外链文件中,页面的下载和渲染都必须停下来等待脚本执行完成.JavaScript 执行过程耗时越久,浏览器等待响应用户输入的时间就越长.浏览器在下载 ...

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

    使用getScript()方法异步请求并执行服务器中的JavaScript格式的文件,它的调用格式如下所示: jQuery.getScript(url,[callback])或$.getScript( ...

  5. (项目名).exe”。已加载符号。 无法查找或打开 PDB 文件。

    无法查找或打开 PDB 文 "wb.exe"(Win32):  已加载"D:\work\test\wb\x64\Debug\wb.exe".已加载符号. &qu ...

  6. 解决方案:“Project1.exe”(Win32): 已加载“C:\Windows\SysWOW64\KernelBase.dll”。无法查找或打开 PDB 文件。

    解决方案:"Project1.exe"(Win32): 已加载"C:\Windows\SysWOW64\KernelBase.dll".无法查找或打开 PDB ...

  7. “Project1.exe”(Win32): 已加载“C:\Windows\syswow64\ntdll.dll”。无法查找或打开 PDB 文件。 “Project1.exe”(Win32): 已加载

    "Project1.exe"(Win32): 已加载"C:\Windows\syswow64\ntdll.dll".无法查找或打开 PDB 文件. " ...

  8. “Project2.exe”(Win32): 已加载“C:\Windows\SysWOW64\msvcp120d.dll”。无法查找或打开 PDB 文件。

    "Project2.exe"(Win32): 已加载"F:\VS\project\Project2\Debug\Project2.exe".已加载符号. &qu ...

  9. ELF文件的加载和动态链接过程

    本文的目的:大家对于Hello World程序应该非常熟悉,随便使用哪一种语言,即使还不熟悉的语言,写出一个Hello World程序应该毫不费力,但是如果让大家详细的说明这个程序加载和链接的过程,以 ...

最新文章

  1. tomcat日志切割
  2. BENDR for BCI : 多伦多大学研究者提出受BERT启发的深度神经网络学习​海量EEG 数据...
  3. mutable关键字
  4. 小型动漫知识图谱的构建 (Python+Neo4j) (纯实践内容,基于bilibili所有正版番剧的动漫、声优、角色、类型)
  5. Jquery ValidateEngine表单验证
  6. python3编程入门_python3编程基础之一:操作
  7. webpack整体了解
  8. SpringCloud集成lombox(eclipes工具)
  9. android 开发规范
  10. python参数检验框架_python-wtforms框架如何自定义校验器的原理和方法总结
  11. qtitanribbon注册_Qt组件QtitanRibbon教程:如何运用office 2016类
  12. Qt下的模态和非模态对话框
  13. 小白白红队初成长(2)主动信息收集
  14. 有负数c语言除法,C语言负数的除法和求余运算
  15. php后缀名的mime类型_PHP实现获取文件mime类型多种方法解析
  16. 白领控诉:被逼下乡5年,我们的幸福何处寻找
  17. 续费Enom域名的三种办法
  18. 劫持 64 位静态程序 fini_array 进行 ROP 攻击
  19. 笔记本更换固态硬盘的教程
  20. fastDfs+tracker+nginx在Centos7上配置文件服务器

热门文章

  1. mysql if语句 oracle,Oracleifelse语句的写法实例
  2. mysql存储过程含义_MySQL存储过程定义中的特性(characteristic)的含义
  3. mysql的count()函数如何选择索引,千万级表的count()查询优化实例
  4. 原生mysql的批量更新及性能测试
  5. 【深度学习入门到精通系列】图片OCR讲解
  6. Ping一下Github,确认本地DNS无法解析方法
  7. cocos creator 获取当前时间_前端开发者入门 Creator 必读吧
  8. stm32锯齿波_工程师实战:基于STM32的波形发生器设计
  9. 进阶学习(3.8) Component Pattern 组合模式
  10. Redis整合Spring Data Redis 开发key和value乱码