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 ↓ RoslynHelloWorld.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 / 9 | 2020 起 | 现代 .NET,跨平台、开源、活跃,去掉 “Core” 后缀 |
| .NET Standard | 2016-2020 | 跨平台 API 兼容标准,现在基本不用 |
| Mono | 2004 起 | 跨平台开源实现,被微软收购后融入主线 |
说”用 .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/