>> >> >> Reference << << << <<<<<<Ref>>>>>>
CSharp and .NET
Modified: 2025-06-01 | Author:ljf12825

1. C#

一种高级的、面向对象的编程语言。由微软开发,语法类似于Java和C++;人类易读、易写,但CPU无法直接理解;C#编译器(csc.exe)将.cs源代码文件编译成CIL(而不是直接编译成机器码)

2. .NET Framework / .NET 5+

一个软件开发平台,提供了一个全面的编程模型和庞大的代码库来构建应用程序
现主要分为

核心组成部分

3. CIL / IL / MSIL(公共中间语言)

一种介于高级语言和机器码之间的低级、于CPU无关的指令集。它看起来有点像汇编语言,但不依赖于任何特定的CPU架构;实现了.NET的“语言互操作性”。不同语言(C#, F#, VB.NET)只要能被编译成CIL,就可以在同一个项目中无缝协作。这也是.NET应用能够“一次编译,多处运行”的基石。编译后的CIL代码存储在以.exe.dll为扩展名的程序集(Assembly)中。程序集还包含元数据(Manifest)等信息

4. CLR(公共语言运行时)

.NET平台的“执行引擎”。它是所有.NET应用程序的运行环境,可以看作是一个虚拟机
核心功能

5. 编译与部署模式

JIT(Just-In-Time Compilation)

CLR的一个核心组件,JIT是默认方式,但不是唯一方式
它是一种介于解释执行和提前编译之间的执行方式
工作流程

AOT(Ahead-of-Time Compilation)

与JIT相对。AOT编译器在程序运行之前就将CIL嗲买完全编译成本地机器码

R2R(ReadyToRun)

一种混合模式。程序集在发布时就被部分编译成本地代码(类似于AOT),但仍然需要CLR来运行(用于垃圾回收、反射等)。它是对纯JIT的一种优化,能显著改善大型应用的启动速度

核心组件与工具

一个C#程序的完整生命周期

  1. 编写:程序员用C#编写源代码(Program.cs
  2. 编译:C#编译器将Program.cs编译成包含CIL的程序集(Program.exe
  3. 分发:将Program.exe和它依赖的其他程序集(.dll)分发给用户。用户需要安装对应版本的.NET运行时(即CLR)
  4. 执行:用户双击Program.exe
  5. 加载:操作系统启动,但识别出这是.NET程序,于是把控制权交给CLR
  6. JIT编译:CLR加载程序集,当需要执行某个方法时,JIT编译器将该方法的CIL代码编译成本地机器码
  7. 运行:CPU执行编译好的本地机器码
  8. 管理:在整个过程中,CLR的垃圾回收器自动回收不再使用的内存,确保程序稳定高效运行

程序集(Assembly)

可以理解为:程序集 = IL + 元数据 + 资源 + 清单(Manifest)
当写下

public class Player {
  public int HP { get; set; }
  public void Attack() { Console.WriteLine("Attack!"); }
}

编译后,Player类的代码会被存成IL,而它的名字、属性、方法签名会写进程序集的元数据表

程序集的组成

一个程序集的结构大概是这样:

可以用ILDasm(IL Disassembler)反汇编出来查看

CLR Header

CLR头是PE的一部分,是.NET专属结构,让Windows知道这个是.NET程序,不是普通程序

[ DOS Header ]
[ PE Header ]
[ Section Table ]
[ CLR Header (.NET Header) ]   <[ Metadata ]
[ IL Code ]
[ Resources ]
CLR Header具体内容

CLR Header其实是一个叫IMAGE_COR20_HEADER的数据结构(定义在corhdr.h里)
它的主要作用:

  1. 指明程序集是托管的(需要CLR运行)
  2. 告诉CLR元数据和IL在文件中的位置和大小
  3. 提供一些运行时信息(入口点、强名称签名、资源表位置等)
CLR Header的字段

简化版的IMAGE_COR20_HEADER包含这些信息

CLR Header的作用
1. C# 语言概览,设计哲学
2. .NET CLR JIT IL等,上面的内容
3. CLI(Common Language Infrastructure), BCL(Base Class Library), FCL(Framework Class Library)