594 字
3 分钟
C# 和 .NET 是什么关系

一句话:C# 是一门语言,.NET 是它跑起来需要的整个生态。日常对话里”C# 和 .NET”几乎可以画等号,但概念上不是一回事。

用 TS / Node 类比最直观#

TypeScript(语言) ←→ C#(语言)
Node.js(运行时) ←→ .NET Runtime(运行时)
npm + tsc + V8(工具链) ←→ dotnet CLI + Roslyn + CLR(工具链)
React/Express(框架/库) ←→ WinUI 3 / ASP.NET Core(框架/库)
package.json(项目定义) ←→ .csproj(项目定义)

写 TS 时不会说”装 TypeScript 才能跑”,说”装 Node.js 才能跑”——写 C# 同理,用户装的是 .NET Runtime,不是”C#“。

编译执行流程#

HelloWorld.cs(C# 源码)
↓ Roslyn 编译器
HelloWorld.dll(IL 中间字节码,类似 Java 的 .class)
↓ CLR 加载 + JIT 编译成机器码
CPU 执行

如果走 NativeAOT,最后两步合并成构建期一次性 AOT 编译:

HelloWorld.cs
↓ Roslyn
HelloWorld.dll (IL)
↓ AOT 编译器
HelloWorld.exe (原生机器码,零运行时依赖)
CPU 直接执行

.NET 的历史包袱(容易让人迷糊)#

同一个名字代表过好几个东西,这才是 .NET 让人困惑的真正原因:

名字时代现状
.NET Framework(1.0 ~ 4.8)2002-2019老平台,Windows 独占,只修 bug
.NET Core(1.0 ~ 3.1)2016-2020跨平台重写,过渡产物,已停
.NET 5 / 6 / 7 / 8 / 92020 起现代 .NET,跨平台、开源、活跃,去掉 “Core” 后缀
.NET Standard2016-2020跨平台 API 兼容标准,现在基本不用
Mono2004 起跨平台开源实现,被微软收购后融入主线

说”用 .NET 8”指的是第 3 行的现代 .NET——跟老的 .NET Framework 是两个东西。看到老博客或 Stack Overflow 答案讲 “install .NET Framework 4.5” 的,那是十几年前的世界。

.NET 不止 C# 一门语言#

语言状态
C#主力,95%+ 的 .NET 代码
F#函数式,小众但活跃,金融/数据领域
VB.NET老系统遗留,新项目几乎没人用

它们编译出来都是同样的 IL 字节码,跑同一个 CLR,可以互相调用。

谁需要装什么#

角色装什么
软件最终用户什么都不用装(如果开发者用了 SCD/AOT)或 .NET Runtime(如果用 FDD)
开发者.NET 8 SDK(含编译器 Roslyn、CLI 工具 dotnet、运行时)
CI / 构建机.NET 8 SDK
服务器(如果跑 ASP.NET).NET 8 Runtime(无需 SDK)

“安装 C#“这事在任何角色都不存在——C# 是语言规范,不是软件包。

C# 和 .NET 是什么关系
https://blog.cuixu.cn/posts/csharp-and-dotnet-relationship/
作者
崔旭
发布于
2026-05-22
许可协议
CC BY-NC-SA 4.0