2、.NET SDK与运行时:安装.NET SDK、理解目标框架(TFM)、运行时标识符(RID)、.NET CLI常用命令
好,咱们正式开始动手了。这一章我带你搞定开发环境。说白了,就是先把枪擦亮,再上战场。
很多新手容易卡在这一步——装完SDK就不知道下一步该干嘛了。别急,我一步步带你走。我个人习惯是,每换一台新电脑,第一件事就是装.NET SDK。为什么?因为后面所有的事情都依赖它。
2.1 安装.NET SDK
先说说SDK和运行时的区别。SDK是「开发工具包」,包含了编译器、调试器、以及运行时。运行时是「运行环境」,只负责跑程序。你作为开发者,装SDK就够了。
去哪里下载?官方地址是 dotnet.microsoft.com/download。我建议你直接装最新的LTS版本,比如现在的.NET 8。为什么?稳定,而且微软会长期支持。
安装过程很简单,下一步下一步就行。但有个坑我要提醒你——安装路径不要带中文。我曾经在一个项目里,同事的电脑用户名是中文,结果编译时各种路径报错,排查了半天。嗯,后来我养成了习惯,装任何开发工具都走纯英文路径。
验证安装是否成功:
dotnet --version
dotnet --list-sdks
dotnet --list-runtimes
如果能看到版本号,恭喜你,环境搭好了。
小技巧: 我习惯在终端里先跑一遍 dotnet --info,它会打印出所有详细信息,包括SDK版本、运行时版本、以及操作系统标识符。这个命令我几乎每天都会用。
2.2 理解目标框架(TFM)
TFM,全称是Target Framework Moniker。听起来很唬人,其实就是一个字符串,告诉编译器:「我要编译成哪个版本的.NET」。比如 net8.0、net6.0、netstandard2.0。
你想想看,为什么要有这个东西?因为不同版本的.NET,API不一样。你写了一个程序,如果目标框架是 net8.0,那它就只能跑在安装了.NET 8运行时的机器上。
常见的TFM有这些:
| TFM | 说明 |
|---|---|
net8.0 |
.NET 8,当前最新LTS版本 |
net6.0 |
.NET 6,上一个LTS版本 |
netstandard2.0 |
.NET Standard,用于库的跨平台兼容 |
net48 |
.NET Framework 4.8,Windows专用 |
我在项目中遇到过一个问题:一个类库项目用了 net8.0,但引用的第三方库只支持 netstandard2.0。结果编译报错,说找不到某个API。后来我改成了多目标框架,同时支持 net8.0 和 netstandard2.0,问题就解决了。
多目标框架示例:
<TargetFrameworks>net8.0;netstandard2.0</TargetFrameworks>
这样你的库就能同时被.NET 8和.NET Framework 4.8的项目引用了。
注意: 多目标框架会增加编译时间,而且有些API在不同框架下行为不一样。我建议你只在确实需要兼容旧项目时才用。
2.3 运行时标识符(RID)
RID,Runtime Identifier。它告诉.NET:「我要发布到哪个操作系统和CPU架构上」。比如 win-x64、linux-x64、osx-arm64。
为什么要关心这个?因为你要做容器化部署,最终镜像要跑在Linux上。如果你在Windows上开发,发布时指定 linux-x64,就能生成Linux可执行文件。
常见的RID:
| RID | 说明 |
|---|---|
win-x64 |
Windows 64位 |
linux-x64 |
Linux 64位 |
osx-x64 |
macOS Intel芯片 |
osx-arm64 |
macOS Apple Silicon芯片 |
我记得有一次,我在MacBook上开发,发布时忘了指定RID,结果生成的程序在Linux服务器上跑不起来。后来加上 --runtime linux-x64 就好了。嗯,这个坑我踩过,你注意一下。
发布命令示例:
dotnet publish -c Release -r linux-x64 --self-contained true
--self-contained true 表示把运行时也打包进去,这样目标机器上不用装.NET也能跑。
2.4 .NET CLI常用命令
CLI是Command-Line Interface的缩写。说白了,就是你在终端里敲的那些命令。我个人习惯用CLI多于用Visual Studio,因为快,而且方便集成到CI/CD流水线里。
下面是我每天都会用到的命令:
dotnet new:创建新项目。比如dotnet new webapi -n MyApi创建一个Web API项目。dotnet build:编译项目。不加参数会编译当前目录下的所有项目。dotnet run:编译并运行。开发时最常用。dotnet test:运行单元测试。我习惯加上--verbosity normal看详细输出。dotnet publish:发布项目,生成部署文件。dotnet add package:添加NuGet包。比如dotnet add package Newtonsoft.Json。dotnet restore:还原依赖。一般在拉取新代码后执行。
常用命令速查表:
| 命令 | 作用 | 示例 |
|---|---|---|
dotnet new |
创建项目 | dotnet new console -n HelloWorld |
dotnet build |
编译 | dotnet build -c Release |
dotnet run |
运行 | dotnet run --project src/MyApp |
dotnet publish |
发布 | dotnet publish -c Release -o ./publish |
dotnet test |
测试 | dotnet test --filter "Category=Unit" |
我的习惯: 我会给常用命令设置别名。比如在 .bashrc 里加上 alias db='dotnet build',这样敲 db 就能编译了。省时间。
2.5 实战:从零创建一个项目
光说不练假把式。咱们来创建一个简单的控制台应用,然后发布成Linux可执行文件。
# 1. 创建项目
dotnet new console -n HelloCloud
# 2. 进入目录
cd HelloCloud
# 3. 修改目标框架为net8.0(默认就是,但确认一下)
# 打开 HelloCloud.csproj,确保 <TargetFramework>net8.0</TargetFramework>
# 4. 编写代码(Program.cs)
Console.WriteLine("Hello, Cloud Native!");
# 5. 编译
dotnet build
# 6. 发布到Linux
dotnet publish -c Release -r linux-x64 --self-contained true -o ./publish
# 7. 查看发布产物
ls ./publish
你会看到 publish 目录下有一个 HelloCloud 可执行文件(没有扩展名)。这就是Linux下的原生可执行文件。你可以把它拷贝到任何Linux机器上直接运行。
注意: 如果你在Windows上发布Linux版本,需要确保安装了对应的交叉编译工具。.NET SDK默认支持,但如果你遇到问题,可以试试安装 dotnet-sdk-8.0 的Linux版本。
好了,这一章的内容就到这里。你装好SDK了吗?如果还没,现在就去装。下一章咱们会深入项目结构,看看一个.NET项目到底长什么样。
公众号:蓝海资料掘金营,微信deep3321