尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

深入了解CLR的加载过程

深入了解CLR的加载过程
📅 发布时间:2026/7/6 2:57:45

我们知道,.net编译器在生成托管代码时会将一些重要信息写入PE文件的header和.text section(后边我会介绍这些写入程序集的重要信息是什么),本文介绍当我们双击一个托管代码写的exe程序时发生的事情。

以下说明所使用的工具是VS2005+sos.dll,示例程序代码如下:

usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;

namespacehello
{
classProgram
{
staticvoidMain(string[] args)
{
Int32 a=1;
Int32 b=2;
b=a+b;
Console.WriteLine(b);

Console.ReadKey();
}
}
}

那么CLR是如何被加载的呢?

1、当你双击一个.exe文件时,Windows操作系统提供的PE Loader会将该exe文件载入内存;

(1)、首先明确一点,PE Loader问什么能加载exe文件呢?因为exe文件就是一种PE文件,PE(Portable Execute)文件是微软Windows操作系统上的程序文件,
EXE、DLL、OCX、SYS文件以及COM组件都是PE文件。

(2)、有必要了解一下PE文件的结构:

图 1

1) Dos stub

由100个左右的字节所组成,用来输出类似“这个程序不能在DOS下运行!”这样的错误信息;

2) PE Signature

DWORD类型,PE文件签名,用来表示这是个PE文件,用ASCII码表示;

3) File Header

包含PE文件最基本信息,通过dumpbin可以看到,如图2所示从这里可以看到:CPU类型为14c,是Intel I386、I486或者I586;section的数量为2;链接器产生这个文件的日期;COFF符号表的文件偏移量,为0;COFF符号表的符号数目,为0;Optional Header的大小。

图2

4) Optional Header

用来存储除了基本信息以外的其他重要信息,具体含义大家可以查阅PE文件格式的相关资料,我这里对一些关心的域根据图3进行一下说明:

-- entry point,指明这个PE文件的入口地址,是一个RVA(相对虚拟地址);

-- base of code,代码块起始地址的RVA,在内存中,代码块通常在PE首部之后,数据块之前;

-- base of data,数据块;

-- image base,PE文件被链接器重定位后的内存地址,可以是链接器优化,节省载入时间和空间;

-- subsystem,可执行文件的用户界面使用的子系统类型。具体值的含义为:

1不需要子系统(比如设备驱动)

2在Windows图形用户界面子系统下运行

3在Windows字符子系统下运行(控制台程序)

5在OS/2字符子系统下运行(仅对OS/2 1.x)

7在Posix字符子系统下运行

所以可以看到我们的程序是一个控制台程序。

--最后定义了一些数据目录,具体内容不再赘述。

图 3

5)section header

Section header可以有一个或多个,见图4、图5、图6。

-- name,表示这个section的名字,例如这个section的名字为.text;

-- virtual address,保存section中数据被载入内存后的RVA;

-- file pointer to raw data,从文件开头到section中数据的偏移量。

图 4

-- Section的原始数据

图 5

相关新闻

  • AtomCode 实测:用 3 个真实项目验证它到底强在哪
  • 2026 内容创作类 AI 赛道全新红利(分短视频、图文绘画、AI 音乐、通用自动化四大板块,全部是今年落地可变现风口)
  • 经典题目(2):最长公共子序列;最长公共子串

最新新闻

  • 3步掌握洛雪音乐音源配置:彻底解决多平台音乐资源整合难题
  • 青少年 Python 入门 | 每天打开看一看——「暑假倒计时日历」+ 每日一句
  • 【Bug已解决】Codex Desktop 报错 Computer Use 插件不可用的解决方案
  • 如何在浏览器中实现实时人体姿态搜索:完整指南与实战应用
  • 基于multisim的音响放大系统设计20Hz-20KHz
  • Android存储清理终极指南:如何用SD Maid 2/SE让手机重获新生

日新闻

  • AI智能体安全防护框架AgentGuard:从原理到实战部署指南
  • KMX63与PIC18F26K40硬件组合及低功耗设计实践
  • 基于YOLO13改进的门体检测模型:C3k2模块与PoolingFormer技术解析

周新闻

  • 基于YOLOv12的番茄成熟度智能检测系统开发
  • 终极RimWorld模组管理指南:用RimSort告别模组冲突烦恼
  • AI Agent框架开发:从理论到实践的完整指南

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号