本文介绍 .NET SDK 和 .NET 8 工具中的新功能。
SDK
本部分包含以下子主题:
- 基于 CLI 的项目评估
- 终端构建输出
- 简化的输出路径
- “dotnet workload clean”命令
- “dotnet publish”和“dotnet pack”资产
-
dotnet restore安全审核 - 模板引擎
- 源链接
- 源生成 SDK
基于 CLI 的项目评估
MSBuild 包含一项新功能,可更轻松地将数据从 MSBuild 合并到脚本或工具中。 以下新标志可用于 CLI 命令,例如 dotnet publish ,以获取数据,以便在 CI 管道和其他地方使用。
| Flag | Description |
|---|---|
--getProperty:<PROPERTYNAME> |
用于检索具有指定名称的 MSBuild 属性。 |
--getItem:<ITEMTYPE> |
检索指定类型的 MSBuild 项。 |
--getTargetResult:<TARGETNAME> |
获取指定目标的运行输出。 |
值将写入标准输出。 多个或复杂值输出为 JSON,如以下示例所示。
>dotnet publish --getProperty:OutputPath
bin\Release\net8.0\
>dotnet publish -p PublishProfile=DefaultContainer --getProperty:GeneratedContainerDigest --getProperty:GeneratedContainerConfiguration
{
"Properties": {
"GeneratedContainerDigest": "sha256:ef880a503bbabcb84bbb6a1aa9b41b36dc1ba08352e7cd91c0993646675174c4",
"GeneratedContainerConfiguration": "{\u0022config\u0022:{\u0022ExposedPorts\u0022:{\u00228080/tcp\u0022:{}},\u0022Labels\u0022...}}"
}
}
>dotnet publish -p PublishProfile=DefaultContainer --getItem:ContainerImageTags
{
"Items": {
"ContainerImageTags": [
{
"Identity": "latest",
...
]
}
}
终端生成输出
dotnet build 有一个新选项,用于生成更现代化的构建输出。 此 终端记录器 输出将错误按其源项目分组,更好地区分多目标项目的不同目标框架,并提供关于构建正在执行的操作的实时信息。 若要选择加入新输出,请使用 --tl 该选项。 有关此选项的详细信息,请参阅 dotnet 生成选项。
简化的输出路径
.NET 8 引入了一个选项,用于简化生成输出的输出路径和文件夹结构。 以前,.NET 应用为不同的生成项目生成了一组深度而复杂的输出路径。 新的简化输出路径结构将所有生成输出收集到一个通用位置,这使得工具更易于预测。
有关详细信息,请参阅 Artifacts 输出布局。
dotnet workload clean 命令
.NET 8 引入了一个新命令,用于清理可能通过多个 .NET SDK 或 Visual Studio 更新留下的工作负荷包。 如果在管理工作负荷时遇到问题,请考虑在重试之前使用 workload clean 安全地还原到已知状态。 该命令有两种模式:
dotnet workload clean为基于文件的或基于 MSI 的工作负荷运行 工作负荷垃圾回收 ,从而清理孤立的包。 孤立包是来自已卸载版本的 .NET SDK,或是那些安装记录已不存在的包。
如果安装了 Visual Studio,该命令还会列出应使用 Visual Studio 手动清理的任何工作负荷。
dotnet workload clean --all此模式更具彻底性,并且会清理计算机上与当前 SDK 工作负载安装类型相关的每个包(不包括来自 Visual Studio 的包)。 它还删除正在运行的 .NET SDK 功能区段及更低版本的所有工作负荷安装记录。
dotnet publish 和 dotnet pack 资产
由于dotnet publish和dotnet pack命令旨在生成生产资产,因此它们现在默认生成Release资产。
以下输出显示了dotnet build和dotnet publish之间的不同行为,以及如何通过将PublishRelease属性设置为false来还原发布Debug资产。
/app# dotnet new console
/app# dotnet build
app -> /app/bin/Debug/net8.0/app.dll
/app# dotnet publish
app -> /app/bin/Release/net8.0/app.dll
app -> /app/bin/Release/net8.0/publish/
/app# dotnet publish -p:PublishRelease=false
app -> /app/bin/Debug/net8.0/app.dll
app -> /app/bin/Debug/net8.0/publish/
有关详细信息,请参阅 “dotnet pack”使用 Release config , “dotnet publish”使用 Release config。
dotnet restore 安全审核
从 .NET 8 开始,可以选择在还原依赖项包时检查已知漏洞。 此审核会生成一份安全漏洞报告,其中包含受影响的包名称、漏洞的严重性,以及有关更多详细信息的公告链接。 运行dotnet add或dotnet restore时,发现的任何漏洞都会显示警告 NU1901-NU1904。 有关详细信息,请参阅 针对安全漏洞的审核。
模板引擎
模板引擎通过集成一些 NuGet 的安全相关功能,在 .NET 8 中提供更安全的体验。 改进包括:
默认不允许从
http://源下载包。 例如,以下命令无法安装模板包,因为源 URL 不使用 HTTPS。dotnet new install console --add-source "http://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public/nuget/v3/index.json"可以使用标志替代此限制
--force。对于
dotnet new、dotnet new install和dotnet new update,请检查模板包中是否存在已知漏洞。 如果发现漏洞并希望继续,则必须使用该--force标志。请提供有关
dotnet new模板包所有者的信息。 所有权由 NuGet 门户验证,可被视为可信特征。对于
dotnet search和dotnet uninstall,需指明模板是否从一个被认为“受信任”的包中安装,该包使用了 保留前缀。
Source Link
源链接 现在包含在 .NET SDK 中。 目标是将源链接捆绑到 SDK 中,而不是要求包使用单独的 <PackageReference> 包,因此默认情况下,更多的包将包含此信息。 此信息将改善开发人员的 IDE 体验。
注释
作为此变更的附带效应,提交信息包含在生成的库和应用程序的InformationalVersion值中,即便那些面向 .NET 7 或更早版本的。 有关详细信息,请参阅 .NET SDK 中包含的源链接。
源代码构建 SDK
Linux 分发生成的(源代码构建)SDK 现在能够使用源代码构建运行时包来生成自包含应用程序。 特定于分发的运行时包与源生成 SDK 捆绑在一起。 在独立部署期间,将引用此捆绑的运行时包,从而为用户启用该功能。
本地 AOT 控制台应用模板
默认控制台应用模板现在开箱即用支持 AOT。 若要创建为 AOT 编译配置的项目,只需运行 dotnet new console --aot。 添加 --aot 的项目配置具有三个效果:
- 发布项目时,使用 Native AOT 生成本机自包含可执行文件,例如,使用
dotnet publish或 Visual Studio。 - 为剪裁、AOT 和单个文件启用兼容性分析器。 这些分析器会提醒你项目的潜在问题部分(如果有)。
- 启用 AOT 的调试时仿真,以便在没有 AOT 编译的情况下调试项目时,可以获得与 AOT 类似的体验。 例如,如果您在未为 AOT 添加注释的 NuGet 包中使用 System.Reflection.Emit(因此兼容性分析器未检测到),则仿真过程意味着在尝试使用 AOT 发布项目时不会遇到任何意外问题。
Linux 上的 .NET
Linux 的最低支持基线
Linux 的最低支持基线已针对 .NET 8 进行了更新。 .NET 面向 Ubuntu 16.04,适用于所有体系结构。 这主要对于定义 .NET 8 的最低 glibc 版本非常重要。 .NET 8 在包含旧版 glibc(如 Ubuntu 14.04 或 Red Hat Enterprise Linux 7)的发行版版本上无法启动。
有关详细信息,请参阅 Red Hat Enterprise Linux 系列支持。
在 Linux 上构建自己的 .NET
在以前的 .NET 版本中,您可以从源代码编译 .NET,但这需要您从与发布对应的 dotnet/installer 仓库提交中创建“源 tarball”。 在 .NET 8 中,这不再需要,可以直接从 dotnet/dotnet 存储库在 Linux 上生成 .NET。 该存储库使用 dotnet/source-build 生成 .NET 运行时、工具和 SDK。 这是 Red Hat 和 Canonical公司 用于构建 .NET 的相同构建。
在容器中构建是大多数人最简单的方法,因为 dotnet-buildtools/prereqs 容器镜像包含所有必需的依赖项。 有关详细信息,请参阅 生成说明。
NuGet 签名验证
从 .NET 8 开始,NuGet 默认在 Linux 上验证已签名的包。 NuGet 还在 Windows 上继续验证已签名的包。
大多数用户不应注意到验证。 但是,如果您有一个位于 /etc/pki/ca-trust/extracted/pem/objsign-ca-bundle.pem 的现有根证书包,您可能会遇到信任失败,并收到 警告 NU3042。
可以通过将环境变量 DOTNET_NUGET_SIGNATURE_VERIFICATION 设置为 false 来选择退出验证。
代码分析
.NET 8 包含多个新的代码分析器和修复程序,以帮助验证你是否正确高效地使用 .NET 库 API。 下表汇总了新的分析器。
| 规则编号 | 类别 | Description |
|---|---|---|
| CA1856 | Performance | 当 ConstantExpectedAttribute 属性未能正确应用于参数时触发。 |
| CA1857 | Performance | 当参数使用 ConstantExpectedAttribute 进行标注但提供的参数不是常量时触发。 |
| CA1858 | Performance | 要确定字符串是否以给定的前缀开头,最好调用String.StartsWith,而不是调用String.IndexOf并将结果与零进行比较。 |
| CA1859 | Performance | 此规则建议尽可能将特定局部变量、字段、属性、方法参数和方法返回类型从接口或抽象类型升级到具体类型。 使用具体类型会导致生成更高的质量代码。 |
| CA1860 | Performance | 若要确定集合类型是否有任何元素,最好使用 Length、Count 或 IsEmpty,而不是调用 Enumerable.Any。 |
| CA1861 | Performance | 作为参数传递的常量数组在重复调用时不会重复使用,这意味着每次都会创建一个新数组。 若要提高性能,请考虑将数组提取到静态只读字段。 |
| CA1865-CA1867 | Performance | 针对只有一个字符的字符串,char 重载是一种性能更佳的选择。 |
| CA2021 | Reliability | Enumerable.Cast<TResult>(IEnumerable) 并且 Enumerable.OfType<TResult>(IEnumerable) 需要兼容类型才能正常运行。 泛型类型不支持扩大和用户定义的转换。 |
| CA1510-CA1513 | 可维护性 | 与构造新异常实例的 if 块相比,抛出辅助程序更简单且效率更高。 这四个分析器是针对以下异常创建的:ArgumentNullException,ArgumentExceptionArgumentOutOfRangeException以及ObjectDisposedException。 |
Diagnostics
C# 热重载支持修改泛型
从 .NET 8 开始,C# 热重载 支持修改泛型类型和泛型方法。 使用 Visual Studio 调试控制台、桌面、移动或 WebAssembly 应用程序时,可以在 C# 代码或 Razor 页面中对泛型类和泛型方法应用更改。 有关详细信息,请参阅 Roslyn 支持的编辑的完整列表。