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 执行

相关推荐
Chen—LSN11 小时前
C语言——文件操作(2)
c语言·开发语言·c++·经验分享·笔记·算法·c#
淡海水15 小时前
00-Unity和C#的GC剖析与对比-全篇导览
unity·c#·游戏引擎·gc
fogota15 小时前
C# `string.Join` 处理 `List<int>`
windows·c#
Behavior18 小时前
Unity 手游动态更换 App 图标 — Android 与 iOS 双端技术方案
c#·unity3d·游戏开发
周杰伦fans18 小时前
构建真正智能的CAD AI绘图代理
开发语言·人工智能·c#
UIU1141 天前
递归算法与汉诺塔
c++·学习·算法·c#·递归
CSharp精选营1 天前
我用 ASP.NET Core 做了个水稻病虫害检查系统
c#·毕业设计·.net core·码农刚子
唐青枫1 天前
我用 C# 开发了一款电子发票自动整理工具
c#·.net
下页、再停留1 天前
【C#桌面客户端系列学习-2】在原来窗口基础上打开新窗口
c#·visual studio
Behavior1 天前
Unity 手游 iOS Deep Link 唤醒全流程:从 URL Scheme / Universal Links 到 C# 层参数投递
c#·unity3d·游戏开发