Ubuntu 上的 .NET 概述

本文介绍如何在 Ubuntu 上安装 .NET。 从 Ubuntu 22.04 开始,内置的 Ubuntu 源中提供大多数受支持的 .NET 版本。 Ubuntu .NET 后移植包存储库包含其余受支持的 .NET 版本,这些版本在这些 Ubuntu 版本的内置 Ubuntu 包源中不可用。 有关可用版本的详细信息,请参阅支持的发行版部分。 此外,对于 Ubuntu 23.10 或之前的版本,Microsoft 包存储库包含当前或以前支持的每个 .NET 版本。

警告

建议在源 .NET 包的 Ubuntu 或 Microsoft 源之间进行选择。 请勿混合来自多个包存储库的 .NET 包,因为当应用尝试解析特定版本的 .NET 时,会导致问题。

方法 优点 缺点
包管理器
(内置
Ubuntu 源)
  • 通常提供最新版本。
  • 可立即提供补丁。
  • 包含依赖项。
  • 轻松删除。
  • 特定 Ubuntu 版本在支持时段内支持可用的 .NET 版本。
  • 支持 Ubuntu 24.04 上用于 .NET 8 的 IBM System Z 平台。
  • 不适用于 Ubuntu 16.04、18.04、20.04。
  • 可用的 .NET 版本因 Ubuntu 版本而异。
  • 预览版不可用。
包管理器
(.NET 向后移植
Ubuntu 源)
  • 包含任何受支持的版本,该版本不包含在内置 Ubuntu 源中。
  • 可立即提供补丁。
  • 包含依赖项。
  • 轻松删除。
  • 与内置 Ubuntu 源兼容。
  • 不适用于 Ubuntu 16.04、18.04、20.04。
  • 需要注册 Ubuntu .NET 向后移植包存储库。
  • 预览版不可用。
包管理器
(Microsoft 源)
  • 始终有支持的版本。
  • 可立即提供补丁。
  • 包含依赖项。
  • 轻松删除。
  • 不适用于 Ubuntu 24.04+。
  • 需要注册 Microsoft 包存储库。
  • 预览版不可用。
  • 仅支持 x64 Ubuntu。
脚本\手动提取
  • 控制 .NET 的安装位置。
  • 预览版可用。
  • 手动安装更新。
  • 手动安装依赖项。
  • 手动删除。

决定如何安装 .NET

当 Ubuntu 版本通过内置或 .NET 向后移植 Ubuntu 源为 .NET 提供支持时,Canonical 将提供对这些 .NET 版本的支持,并且这些版本可能针对不同的工作负载进行优化。 Microsoft 为 Microsoft 包存储库源中的包提供支持。

使用以下部分来确定应如何安装 .NET:

我使用的是 Ubuntu 22.04 或更高版本,我只需要 .NET

通过 Ubuntu 源安装 .NET。 有关详细信息,请参阅以下页面:

重要

Canonical 提供的 .NET SDK 版本始终位于 .1xx 功能区段。 如果要使用较新的功能区段版本,请使用 Microsoft 源安装 SDK。 请务必查看 Linux 上的 .NET 包混合一文中的信息,了解在存储库源之间切换的含义。

如果要安装 Microsoft 存储库以使用其他 Microsoft 包(如 powershellmdatpmssql),则需要取消 Microsoft 存储库提供的 .NET 包的优先级。 有关如何取消包优先级的说明,请参阅我的 Linux 发行版提供 .NET 包,我想使用它们

我使用的是低于 Ubuntu 22.04 的版本

请使用特定于版本的 Ubuntu 页上的说明。

有关 Ubuntu 版本支持的 .NET 版本的详细信息,请查看支持的发行版部分。 如果要安装不支持的版本,请参阅注册 Microsoft 包存储库

我使用的是其他 Microsoft 包,例如 powershellmdatpmssql

如果 Ubuntu 版本通过 Ubuntu 源为 .NET 提供支持,则必须决定哪个源应安装 .NET。 支持的发行版部分提供了一个表,其中列出了包源提供的 .NET 版本。

如果需要从 Ubuntu 源获取 .NET 包,则需要取消 Microsoft 存储库提供的 .NET 包的优先级。 有关如何取消包优先级的说明,请参阅我的 Linux 发行版提供 .NET 包,我想使用它们

我需要创建 .NET 应用

对 SDK 使用与运行时相同的包源。 建议通过 Ubuntu 源安装 .NET。 但是,如果想要从另一个源安装 .NET(例如,通过 Microsoft 包存储库访问更高 SDK 功能带),则应卸载 .NET,将包管理器配置为忽略 Ubuntu 源中的 .NET 包,并从另一个源重新安装它。

请查看决定如何安装 .NET 部分中的其他建议。

我需要在容器、云或持续集成场景中运行 .NET 应用

如果 Ubuntu 版本提供所需的 .NET 版本,请从 Ubuntu 源安装它。 否则,请注册 Microsoft 包存储库,并从该存储库安装 .NET。 请查看支持的发行版部分中的信息。

如果所需的 .NET 版本不可用,请尝试使用 dotnet-install 脚本

我的 Ubuntu 分发版不包含所需的 .NET 版本,或者我需要一个不支持的 .NET 版本

建议使用 APT 和 Microsoft 包存储库。 有关详细信息,请参阅注册并安装 Microsoft 包存储库部分。

我需要安装预览版

使用以下其中一种方式来安装 .NET:

我不需要使用 APT

如果需要自动安装,请使用 Linux 安装脚本

如果要完全控制 .NET 安装体验,请下载 tarball 并手动安装 .NET。 有关详细信息,请参阅手动安装

我使用的是基于 Arm 的 CPU

如果 Ubuntu 版本提供所需的 .NET 版本,请从内置源安装它。 请查看支持的发行版部分中的信息。

如果所需的 .NET 版本不可用,请尝试使用以下任一方法安装 .NET:

我使用的是 IBM System Z 平台

从 Ubuntu 24.04 上的 .NET 8 开始,Canonical 支持 IBM System Z 平台的 .NET。 Canonical 致力于将支持扩展到其他 .NET 和 Ubuntu 版本。

通过内置 Ubuntu 源安装 .NET。 有关详细信息,请参阅以下页面:

支持的发行版

下表列出了当前支持的 .NET 版本以及支持它们的 Ubuntu 版本。 每个链接都转到特定的 Ubuntu 版本页,其中包含有关如何为该版本的 Ubuntu 安装 .NET 的具体说明。

Ubuntu 支持的 .NET 版本 适用于
内置 Ubuntu 源
可用于
.NET 向后移植
Ubuntu 源
可用于
Microsoft 源
24.04 (LTS) 8.0、7.0、6.0 8.0 7.0、6.0
23.10 8.0、7.0、6.0 8.0、7.0、6.0 8.0、7.0、6.0
22.04 (LTS) 8.0、7.0、6.0 8.0、7.0、6.0 8.0、7.0、6.0、3.1
20.04 (LTS) 8.0、7.0、6.0 8.0、7.0。 6.0、5.0、3.1、2.1
18.04 (LTS) 7.0、6.0 7.0、 6.0、5.0、3.1、2.2、2.1
16.04 (LTS) 6.0 6.0、5.0、3.1、3.0、2.2、2.1、2.0

Ubuntu 版本的支持期结束时,该特定 Ubuntu 版本将不再支持 .NET。

Canonical 在 Ubuntu 版本生存期内在其内置 Ubuntu 源中支持 .NET 版本(即使在 Microsoft 提供的支持生存期之外),并为 .NET 向后移植包存储库中的 .NET 版本提供了最佳支持,该版本不会超出 Microsoft 提供的支持生存期。

以下 .NET 版本 ❌ 不再受到支持:

  • .NET 5
  • .NET Core 3.1
  • .NET Core 3.0
  • .NET Core 2.2
  • .NET Core 2.1
  • .NET Core 2.0

Ubuntu .NET 向后移植包存储库

Ubuntu .NET 向后移植包存储库提供在内置 Ubuntu 源中不可用的 .NET 版本。 支持的发行版部分提供了一个表,其中列出了包源提供的 .NET 版本。 Canonical 维护此包存储库中包含的包,并提供最佳支持,这不会超出 Microsoft 提供的支持生存期或特定 Ubuntu 版本的支持期。

有关详细信息,请参阅 Ubuntu .NET 向后移植包存储库 的 Web 视图

注册 Ubuntu .NET 向后移植包存储库

打开终端并运行以下命令:

sudo add-apt-repository ppa:dotnet/backports

提示

无需调用 apt update。 默认情况下,add-apt-repository 命令会执行此操作。

注意

Ubuntu .NET 向后移植包存储库与内置的 Ubuntu 源兼容。 因此,无需将包管理器配置为忽略内置 Ubuntu 源中的 .NET 包。

取消注册 Ubuntu .NET 向后移植包存储库

如果不想再使用 Ubuntu .NET 向后移植包存储库中的包,可以取消注册它。 打开终端并运行以下命令:

sudo add-apt-repository --remove ppa:dotnet/backports

重要

取消注册 Ubuntu .NET 向后移植包存储库不会卸载任何包。

找不到 add-apt-repository 命令

add-apt-repository(1) 实用工具预安装在大多数 Ubuntu 安装上。

如果收到一条错误消息,指出找不到 add-apt-repository 命令,则必须安装提供此命令的 software-properties-common 包。 打开终端并运行以下命令:

sudo apt update
sudo apt install software-properties-common

注册 Microsoft 包存储库

Microsoft 包存储库包含以前或当前受 Ubuntu 版本支持的所有 .NET 版本。 如果 Ubuntu 版本提供 .NET 包,则需要取消 Ubuntu 包的优先级并使用 Microsoft 存储库。 有关如何取消包优先级的说明,请参阅我需要不由 Linux 分发版提供的 .NET 版本

重要

Microsoft 包存储库仅支持面向 x64 体系结构的 .NET 包。 对于 Arm 等其他体系结构,必须通过其他一些方式安装 .NET,例如,通过安装程序脚本,或通过手动安装

预览版在 Microsoft 包存储库中不可用。 有关详细信息,请参阅安装预览版本

注意

建议仅使用一个存储库来管理所有 .NET 安装。 如果以前使用 Ubuntu 存储库安装了 .NET,则必须清理 .NET 包的系统,并将 APT 配置为忽略 Ubuntu 源。 有关如何执行此操作的详细信息,请参阅我需要不由 Linux 分发版提供的 .NET 版本

使用 APT 进行安装可通过几个命令来完成。 安装 .NET 之前,请运行以下命令,将 Microsoft 包签名密钥添加到受信任密钥列表,并添加包存储库。

打开终端并运行以下命令:

# Get OS version info
source /etc/os-release

# Download Microsoft signing key and repository
wget https://packages.microsoft.com/config/$ID/$VERSION_ID/packages-microsoft-prod.deb -O packages-microsoft-prod.deb

# Install Microsoft signing key and repository
sudo dpkg -i packages-microsoft-prod.deb

# Clean up
rm packages-microsoft-prod.deb

# Update packages
sudo apt update

提示

以前的脚本是针对 Ubuntu 编写的,如果使用派生的分发版(例如 Linux Mint),它可能无法正常工作。 很可能不会为 $repo_version 变量分配正确的值,从而导致 wget 命令的 URI 无效。 此变量映射到要为其获取包的特定 Ubuntu 版本,例如 22.04 或 23.10。

可以使用 Web 浏览器并导航到 https://packages.microsoft.com/config/ubuntu/,查看哪些版本的 Ubuntu 可用作 $repo_version 值。

安装 .NET

注册 Microsoft 包存储库后,或者如果 Ubuntu 版本的 Ubuntu 源支持 .NET 包,则可以使用 sudo apt install <package-name> 命令通过包管理器安装 .NET。 将 <package-name> 替换为要安装的 .NET 包的名称。 例如,若要安装 .NET SDK 8.0,请使用命令 sudo apt install dotnet-sdk-8.0。 下表列出了当前支持的 .NET 包:

产品 类型 程序包
8.0 ASP.NET Core 运行时 aspnetcore-runtime-8.0
8.0 .NET 运行时 dotnet-runtime-8.0
8.0 .NET SDK dotnet-sdk-8.0
7.0 ASP.NET Core 运行时 aspnetcore-runtime-7.0
7.0 .NET 运行时 dotnet-runtime-7.0
7.0 .NET SDK dotnet-sdk-7.0
6.0 ASP.NET Core 运行时 aspnetcore-runtime-6.0
6.0 .NET 运行时 dotnet-runtime-6.0
6.0 .NET SDK dotnet-sdk-6.0

如果要安装不受支持的 .NET 版本,请查看支持的发行版部分,了解该版本的 .NET 是否可用。 然后,替换要安装的 .NET 版本。 例如,若要安装 ASP.NET Core 8.0,请使用包名称 aspnetcore-runtime-8.0

提示

如果不创建 .NET 应用,请安装 ASP.NET Core 运行时,因为它包括 .NET 运行时,还支持 ASP.NET Core 应用。

安装 .NET 后,某些环境变量会影响其运行方式。 有关详细信息,请参阅 .NET SDK 和 CLI 环境变量

卸载 .NET

如果通过包管理器安装 .NET,请使用 apt-get remove 命令以相同的方式卸载:

sudo apt-get remove dotnet-sdk-6.0

有关详细信息,请参阅卸载 .NET

安装预览版本

包存储库中未提供 .NET 的预览版和候选发布版本。 可通过下面其中一种方式安装 .NET 的预览版和候选发布版本:

删除预览版本

使用包管理器管理 .NET 安装时,如果之前安装了预览版本,则可能会遇到冲突。 包管理器可能会将非预览版本解释为 .NET 的较早版本。 若要安装非预览版本,需要首先卸载预览版本。 有关如何卸载 .NET 的详细信息,请参阅如何删除 .NET 运行时和 SDK

使用 APT 更新 .NET

如果通过包管理器安装 .NET,则可以使用 apt upgrade 命令升级包。 例如,以下命令升级最新版本的 dotnet-sdk-7.0 包:

sudo apt update
sudo apt upgrade dotnet-sdk-7.0

提示

如果安装 .NET 后已升级过 Linux 分发版,可能需要重新配置 Microsoft 包存储库。 运行当前分发版本的安装说明,升级到相应的包存储库以进行 .NET 更新。

疑难解答

从 Ubuntu 22.04 开始,可能会遇到似乎只有一部分 .NET 可用的情况。 例如,已安装运行时和 SDK,但在运行 dotnet --info 时仅列出运行时。 此解决方案可与使用两个不同的包源有关。 内置 Ubuntu 22.04 和 Ubuntu 22.10 包源包含某些版本的 .NET,但不是全部版本,可能还从 Microsoft 源安装了 .NET。 有关如何解决此问题的详细信息,请参阅排查与 Linux 上缺少文件相关的 .NET 错误

APT 问题

本部分提供有关使用 APT 安装 .NET 时可能会遇到的常见错误的信息。

找不到包

重要

使用包管理器从 Microsoft 包源安装 .NET 仅支持 x64 体系结构。 Microsoft 包源不支持其他体系结构,如 Arm

有关在不使用包管理器的情况下安装 .NET 的详细信息,请参阅以下文章之一:

找不到\无法安装某些包

说明

此信息仅适用于从 Microsoft 包源安装 .NET。

如果收到类似于“找不到包 {dotnet-package}”或“无法安装某些包”的错误消息,请运行以下命令

以下命令组中有两个占位符。

  • {dotnet-package}
    此项表示要安装的 .NET 包,如 aspnetcore-runtime-8.0。 它在以下 sudo apt-get install 命令中使用。

首先,尝试清除包列表:

sudo dpkg --purge packages-microsoft-prod && sudo dpkg -i packages-microsoft-prod.deb
sudo apt-get update

然后,再次尝试安装 .NET。 如果这不起作用,可使用以下命令运行手动安装:

如果使用的是 Ubuntu 23.10 或更高版本,请尝试以下命令:

# Define the OS version, name, and codename
source /etc/os-release

# Download the Microsoft keys
sudo apt-get install -y gpg wget
wget https://packages.microsoft.com/keys/microsoft.asc
cat microsoft.asc | gpg --dearmor -o microsoft.asc.gpg

# Add the Microsoft repository to the system's sources list
wget https://packages.microsoft.com/config/$ID/$VERSION_ID/prod.list
sudo mv prod.list /etc/apt/sources.list.d/microsoft-prod.list

# Move the key to the appropriate place
sudo mv microsoft.asc.gpg $(cat /etc/apt/sources.list.d/microsoft-prod.list | grep -oP "(?<=signed-by=).*(?=\])")

# Update packages and install .NET
sudo apt-get update && \
  sudo apt-get install -y {dotnet-package}

如果使用的是 23.10 之前的 Ubuntu 版本,请尝试以下命令:

# Define the OS version, name, and codename
source /etc/os-release

# Download the Microsoft keys
sudo apt-get install -y gpg wget
wget https://packages.microsoft.com/keys/microsoft.asc
cat microsoft.asc | gpg --dearmor -o microsoft.asc.gpg
sudo mv microsoft.asc.gpg /etc/apt/trusted.gpg.d/

# Add the Microsoft repository to the system's sources list
wget https://packages.microsoft.com/config/$ID/$VERSION_ID/prod.list
sudo mv prod.list /etc/apt/sources.list.d/microsoft-prod.list

# Set ownership
sudo chown root:root /etc/apt/trusted.gpg.d/microsoft.asc.gpg
sudo chown root:root /etc/apt/sources.list.d/microsoft-prod.list

# Update packages and install .NET
sudo apt-get update && \
  sudo apt-get install -y {dotnet-package}

未能提取

安装 .NET 包时,可能会看到类似于 Failed to fetch ... File has unexpected size ... Mirror sync in progress? 的错误。 此错误表示 .NET 的包源正在通过更新的包版本进行更新,应稍后重试。 升级期间,包源的不可用时间不应超过 30 分钟。 如果持续收到此错误超过 30 分钟,请在 https://github.com/dotnet/core/issues 中提交问题。

依赖项

使用包管理器进行安装时,将为你安装这些库。 但是,如果手动安装 .NET 或发布独立应用,则必须安装以下依赖项才能运行应用:

  • ca-certificates
  • libc6
  • libgcc1(适用于 16.x 和 18.x)
  • libgcc-s1(适用于 20.x 或更高版本)
  • libgssapi-krb5-2
  • libicu55(针对 16.x)
  • libicu60(针对 18.x)
  • libicu66(适用于 20. x)
  • libicu70(适用于 22.04)
  • libicu72(适用于 23.10)
  • libicu74(适用于 24.04 或更高版本)
  • liblttng-ust1(适用于 22.x 或更高版本)
  • libssl1.0.0(适用于 16.x)
  • libssl1.1(适用于18.x、20.x)
  • libssl3(适用于 22.x 或更高版本)
  • libstdc++6
  • libunwind8(适用于 22.x 或更高版本)
  • zlib1g

可以使用 apt install 命令安装依赖项。 以下代码片段演示了如何安装 zlib1g 库:

sudo apt install zlib1g

如果 .NET 应用使用 System.Drawing.Common 程序集,则还需要安装 libgdiplus。 由于 Linux 上不再支持 System.Drawing.Common,因此这仅适用于 .NET 6,并且需要设置 System.Drawing.EnableUnixSupport 运行时配置开关。

可以通过将 Mono 存储库添加到系统来安装最新版 libgdiplus。

后续步骤