要点
.NET 的工具链比大多数语言更”一条龙”:一个 .NET SDK(Software Development Kit)同时提供编译器、运行时、项目构建器(dotnet CLI)和 NuGet 包管理。装完 SDK 就能写、能跑、能发包,不需要再单独配构建工具。要管住的只有两件事:项目用哪个 SDK 主版本(global.json),以及包依赖能否复现(restore)。
版本现状:认准 LTS 线
.NET 每年 11 月发一个大版本,偶数版本为 LTS(Long Term Support,三年支持),奇数版本为 STS(约十八个月)。选型直接选当前 LTS:
| 版本 | 类型 | 支持截止 | 说明 |
|---|---|---|---|
| .NET 10 | LTS | 2028-11 | 2025-11 发布,本系列的基准版本,对应 C# 14 |
| .NET 8 / .NET 9 | LTS / STS | 支持期内 | 上一代版本;新项目直接从 .NET 10 起步 |
和 Java 对照:Java 的 LTS 间隔不规则(21、25 之间隔四年),.NET 是严格的”每年 11 月、偶数 LTS”。所以 .NET 的版本焦虑更小——只要钉住偶数线,最多三年一升级。
SDK 与运行时的关系
从 JDK 转过来的读者可以直接映射:SDK 之于 Runtime,约等于 JDK 之于 JRE。区别是 .NET 的 SDK、运行时、CLI 打成一个包安装,不需要分开装两样东西。
| 概念 | .NET | Java 对照 |
|---|---|---|
| 开发工具包 | .NET SDK(dotnet 命令) | JDK(javac + java) |
| 运行时 | .NET Runtime(随 SDK 附带,也可单独部署) | JRE |
| 构建工具 | dotnet CLI 内建(MSBuild 在底层) | Maven / Gradle(需另装) |
| 包仓库 | NuGet(nuget.org) | Maven Central |
安装 .NET SDK
三个平台各给一条主渠道,安装命令只锁主版本线,不锁补丁号——补丁会随 Windows Update / 包管理器滚动更新:
# Windows(winget 包 ID 按主版本命名,10 即 LTS 线)
winget install Microsoft.DotNet.SDK.10
1. macOS
brew install --cask dotnet-sdk
1. Linux(Ubuntu/Debian 官方源),或任意平台通用的安装脚本
sudo apt-get install dotnet-sdk-10.0
curl -sSL https://dot.net/v1/dotnet-install.sh | bash /dev/stdin --channel 10.0
装完验证。重点看 SDK 列表里有 10.0 一行:
dotnet --info # SDK、运行时、环境一览
dotnet --list-sdks # 已安装的全部 SDK
dotnet --list-runtimes
反模式:照抄教程里钉死补丁号的安装命令。教程写下的 10.0.x 到你执行时多半已有更新的补丁,抄旧补丁号等于主动装已知漏洞。命令只认主版本线(10.0),补丁交给包管理器。
最小验收:三十秒跑通
dotnet new console -n hello
cd hello
dotnet run
输出 Hello, World! 即闭环打通。注意这里没有显式”编译”步骤——dotnet run 在需要时自动构建,与 java Hello.java 的单文件直跑体验类似,但产物是完整的 IL 程序集。.NET 10 还支持文件式应用(file-based apps):单个 .cs 文件不建项目也能 dotnet run app.cs,适合一次性脚本,正式工程仍走项目。
dotnet CLI 常用命令表
dotnet CLI 是唯一需要记的工具,日常覆盖九十百分比的操作:
| 命令 | 作用 | 对应 Java 生态 |
|---|---|---|
| dotnet new console / web / xunit | 从模板建项目 | archetype / Spring Initializr |
| dotnet build | 编译到 bin/ | mvn compile |
| dotnet run | 构建并运行 | mvn exec:java |
| dotnet watch | 改动自动重编译重启 | spring-boot-devtools |
| dotnet test | 跑全部测试 | mvn test |
| dotnet add package 名字 | 加 NuGet 依赖 | 加 dependency 到 pom.xml |
| dotnet add reference ../A.csproj | 项目间引用 | module 依赖 |
| dotnet publish -c Release | 产出可部署产物 | mvn package + shade |
| dotnet format | 格式化(EditorConfig 驱动) | spotless / fmt-maven |
| dotnet tool install -g dotnet-ef | 装全局工具 | sdkman 装 maven |
项目与解决方案结构
两个文件类型,职责清楚:
- .csproj:项目文件,SDK 风格(SDK-style project)下极简——TargetFramework、依赖列表就够,不需要手写编译细节。一个 .csproj 就是一个可构建单元。
- .sln:解决方案(solution),只是多个 .csproj 的编排在很多项目共存时用。
dotnet new sln生成,小项目可以不要它。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
</Project>
新模板默认开 Nullable(可空引用类型检查)和 ImplicitUsings(常用命名空间免 using)——这两个开关保持默认,前者是编译期防空利器,后者只是省样板。
多 SDK 共存时,用 global.json 给项目锁 SDK 主版本,进目录自动生效:
{
"sdk": {
"version": "10.0.100",
"rollForward": "latestFeature"
}
}
rollForward: latestFeature 表示”10.0.1xx 特性带内自动向前滚”,补丁不钉死——等价于 Maven Wrapper 锁大版本的效果。用 dotnet new globaljson 可直接生成。
NuGet:依赖从哪来
NuGet 是 .NET 的包生态,nuget.org 是中央仓库。依赖声明在 .csproj 里,实际解析靠 restore(还原):dotnet restore 按依赖范围拉包到全局缓存 ~/.nuget/packages,本机多个项目共享,不会像 node_modules 那样每个项目复制一份。默认没有锁文件,CI 要严格复现时在 csproj 加 RestorePackagesWithLockFile=true,生成 packages.lock.json 并提交,等价于 npm 的 package-lock.json。国内加速可配置 NuGet 源镜像。
IDE 三选一
| 方案 | 平台 | 费用口径 | 适合 |
|---|---|---|---|
| Rider | Win/macOS/Linux | 非商业用途免费(2024-10 起),商业需订阅 | 跨平台首选;IntelliJ 用户零成本迁移;重构与调试体验一致 |
| Visual Studio 2026 | 仅 Windows | Community 版免费(有使用限制),专业版付费 | Windows 上功能最全:设计器、性能 Profiler、全套 Microsoft 工具链 |
| VS Code + C# Dev Kit | 全平台 | 个人/学术/开源免费,小团队(不超过 5 人)商用也免费;需登录微软账号 | 已用 VS Code 的人最顺;轻量但解决方案视图、测试面板都有 |
三者的构建结果完全一致——都只是 dotnet CLI 的壳,IDE 差异不影响产物。选型看平台与习惯:macOS/Linux 在 Rider 与 VS Code 里挑,Windows 三者皆可。
环境检查清单
- dotnet –list-sdks 里能看到 10.0.x
- dotnet new console + dotnet run 全绿
- global.json 已锁主版本并配 rollForward
- IDE 打开 .csproj 能识别 TargetFramework 与引用
- dotnet add package 能正常拉包(必要时配镜像源)
常见问题
装了 SDK 但 dotnet 命令找不到
多半是 PATH 没刷新,重开终端;仍不行则检查 ~/.dotnet(macOS/Linux 脚本安装路径)是否在 PATH 里。Windows 用安装器不会出这个问题。
机器上有多个 SDK,项目用了错的版本
dotnet 默认用最新 SDK 编译,但 TargetFramework 决定运行时目标——SDK 11 也能编 net10.0 项目。要锁 SDK 就放 global.json,团队协作时这份文件必须提交。
.NET Framework 和 .NET 是一回事吗
不是。.NET Framework(最高 4.8)是老的 Windows 专有实现,不再加新特性;本系列说的 .NET(曾叫 .NET Core)是跨平台的开源实现,从 .NET 5 起改名延续至今。搜资料时看到 4.x 的答案要警惕过时。
延伸阅读
环境就绪,下一步写代码:本系列下一篇《第一个 C# 应用》会从 dotnet new 开始做一个能用的命令行小工具。想横向对比工具链设计,站内《Java 环境搭建与工具链》是同结构的一篇——SDK 安装、构建工具、wrapper 锁版本三件事在两个生态里各是怎么解的,读完对两边理解都更深。
版本核实(以官方文档为准):.NET 10 为当前 LTS(2025-11-11 发布,支持至 2028-11-10),.NET 8/9 已于 2026-11-10 停止支持,.NET 11 为 STS 线(2026-11 GA);C# 14 随 .NET 10 发布;文件式应用(dotnet run app.cs)为 .NET 10 新增;Rider 自 2024-10 起非商业用途免费;C# Dev Kit 个人/学术/开源免费且小团队商用免费;Visual Studio 2026 已随 .NET 10 发布。安装命令不钉补丁号,具体以官方文档为准。