C# 程序集、IL、CLR 执行流程

一、 3 个核心名词

1. 程序集(Assembly)

你写的 C# 代码编译后生成的文件,就是程序集。

  • 常见格式:.exe(可执行)、.dll(类库)
  • 它不是机器码,而是 IL 代码 + 元数据 的集合
  • 一个程序集 = 一个 DLL / EXE
2. IL(Intermediate Language)中间语言
  • C# 编译后不会直接变成 CPU 指令
  • 而是变成一种统一的中间代码,叫 IL
  • 它是平台无关的(Windows/Linux/macOS 都能用)
  • IL 类似汇编,但和 CPU 无关
3. CLR(Common Language Runtime)

.NET 的运行时虚拟机,负责:

  • 加载程序集
  • 将 IL 编译成机器码(JIT)
  • 内存管理(GC)
  • 安全检查
  • 执行代码

一句话:CLR 就是 .NET 程序的 "操作系统"

二、C# 程序完整生命周期

第一步:写 C# 代码 → 编译器编译
cs 复制代码
Console.WriteLine("Hello");

C# 编译器(csc / Roslyn)做两件事:

  1. 把代码翻译成 IL 中间代码
  2. 生成 元数据(描述类、方法、字段、版本、依赖...)

最终输出:

程序集(.exe/.dll)

第二步:运行程序 → 启动 CLR

双击 exe 或 dotnet run 时:

  1. 操作系统启动 CLR 运行时
  2. CLR 加载程序集
  3. CLR 找到入口方法 Main()
第三步:JIT 编译器(即时编译)

重点:CLR 不会直接执行 IL IL 必须先变成 CPU 原生机器码

负责这件事的就是:

JIT(Just-In-Time)即时编译器

JIT 做什么?

  • 第一次调用方法时
  • IL → 对应平台的原生机器码
  • 缓存机器码,下次直接运行(超快)

这就是为什么:.NET 程序第一次运行慢一点,后面飞快

第四步:CPU 执行机器码

最终交给 CPU 执行的是:x86 /x64 / ARM 机器码

cs 复制代码
C# 源代码
   ↓ (编译:csc/Roslyn)
IL 中间代码 + 元数据
   ↓ (打包)
程序集(.exe / .dll)
   ↓ (运行)
CLR 启动
   ↓ (JIT 编译)
CPU 原生机器码
   ↓
执行程序

三、IL 到底是什么?

cs 复制代码
int a = 1;
int b = 2;
int c = a + b;

编译成 IL:

cs 复制代码
ldc.i4.1
ldc.i4.2
add
stloc.2

特点:

  • 栈操作
  • 平台无关
  • 所有 .NET 语言(C#/VB/F#)最终都变成 IL
  • 这就是 .NET 多语言通用 的原因

四、程序集里面有什么?、

一个 .dll / .exe 程序集包含:

  1. IL 代码(方法实现)
  2. 元数据
    • 类名、方法名、字段
    • 依赖哪些程序集
    • 版本、公钥、签名
  3. 清单(Manifest)
    • 程序集版本
    • 出口类型
    • 安全信息

五、CLR 执行方法的完整流程

cs 复制代码
1. 调用方法
2. CLR 检查方法是否已 JIT 编译
   ✅ 已编译 → 直接执行机器码
   ❌ 未编译 → JIT 把 IL → 机器码,缓存
3. 执行机器码
4. 运行结束

总结

  • C# 编译 → 生成 IL,不是机器码
  • IL 放在程序集里(exe/dll)
  • CLR 是 .NET 虚拟机,负责加载和运行程序集
  • JIT 将 IL 编译成平台原生机器码
  • JIT 只编译一次,缓存后直接运行

源代码 → 编译成 IL → 放进程序集 → CLR 加载 → JIT 编译成机器码 → CPU 执行

相关推荐
ctrl_v助手21 分钟前
VisionPro (R) QuickBuild相机的连接
服务器·笔记·数码相机·c#
北域码匠1 小时前
奇偶归并排序:并行计算的排序利器
数据结构·算法·c#·排序算法
zhangfeng11332 小时前
国家超算中心 昆山站 异构加速卡1 显存16GB详细配置, 海光 Z100SM HCU
linux·网络·深度学习·c#
z落落2 小时前
C# WinForm TreeView 树形控件+ListView控件+菜单栏
开发语言·c#
ABprogramming3 小时前
Aspire入门指南
c#·.net
加号33 小时前
【C#】VS2022 传统 ASP.NET Web 服务(.asmx)接口实现指南
前端·c#·asp.net
加号315 小时前
【C#】 文件与目录管理:创建、删除操作的技术解析
开发语言·c#
用户3952409988019 小时前
SqlSugar 连接 PostgreSQL 报错 42P01: relation does not exist 的排查与修复
c#
2601_9618752419 小时前
法考考试时间安排及科目|时间表|资料已整理
开发语言·c#·inverted-index·suffix-tree·sstable·r-tree·lsm-tree
ServBay20 小时前
你跟高级 C# 工程师的区别,就是这8个开发技巧
后端·c#·.net