相关文章推荐
刀枪不入的领结  ·  java ...·  7 月前    · 
谦和的电池  ·  Sci. Adv. ...·  1 年前    · 

本文介绍如何在 Ubuntu 上安装 .NET。 Microsoft 包存储库包含 Ubuntu 上当前或以前支持的每个 .NET 版本。 从 Ubuntu 22.04 开始,Ubuntu 包源中提供了某些版本的 .NET。 有关可用版本的详细信息,请参阅 支持的发行版 部分。

建议避免同时使用适用于 .NET 的 Microsoft 和 Ubuntu 包存储库,因为当应用尝试解决特定版本的 .NET 时,这会导致出现问题。

程序包管理器
(Microsoft 源)
  • 支持的版本始终可用。
  • 修补程序以正确的方式提供。
  • 包含依赖项。
  • 轻松删除。
  • 需要注册 Microsoft 包存储库。
  • 预览版不可用。
  • 仅支持 x64 Ubuntu。
程序包管理器
(Ubuntu 源)
  • 通常提供最新版本。
  • 修补程序以正确的方式提供。
  • 包含依赖项。
  • 轻松删除。
  • 可用的 .NET 版本因 Ubuntu 版本而异。
  • 预览版不可用。
  • 仅支持 x64 Ubuntu。
脚本 \ 手动提取
  • 控制 .NET 的安装位置。
  • 预览版可用。
  • 手动安装更新。
  • 手动安装依赖项。
  • 手动删除。

决定如何安装 .NET

当你的 Ubuntu 版本通过内置 Ubuntu 源支持 .NET 时,Canonical 会提供对这些 .NET 版本的支持,并且这些生成可以针对不同的工作负载进行优化。 Microsoft 为 Microsoft 包存储库源中的包提供支持。

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

  • 我使用的是 Ubuntu 22.04、22.10 或 23.04,我只需要 .NET 6.0 或 .NET 7.0
  • 我使用的是 22.04 之前的 Ubuntu 版本
  • 我使用的是其他 Microsoft 包,例如 powershell mdatp mssql
  • 我想创建 .NET 应用
  • 我想在容器、云或持续集成方案中运行 .NET 应用
  • 我的 Ubuntu 发行版不包含所需的 .NET 版本,或者我需要一个不支持的 .NET 版本
  • 我想安装预览版
  • 我不想使用 APT
  • 我使用的是基于 Arm 的 CPU
  • 我使用的是 Ubuntu 22.04、22.10 或 23.04,我只需要 .NET 6.0 或 .NET 7.0

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

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

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

    我使用的是 22.04 之前的 Ubuntu 版本

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

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

    我使用的是其他 Microsoft 包,例如 powershell mdatp mssql

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

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

    我想创建 .NET 应用

    对 SDK 使用与运行时相同的包源。 例如,如果使用的是 Ubuntu 22.04 和 .NET 6,但未使用 .NET 7,则建议通过内置 Ubuntu 源安装 .NET。 但是,如果移动到 Canonical for Ubuntu 22.04 未提供的 .NET 7,则应 使用 Microsoft 包存储库注册并安装 。 查看 决定如何安装 .NET 部分中的其他建议。

    我想在容器、云或持续集成方案中运行 .NET 应用

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

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

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

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

    我想安装预览版

    使用以下方法之一安装 .NET:

  • 使用 install-dotnet 脚本安装 .NET。
  • 手动安装 .NET
  • 我不想使用 APT

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

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

    我使用的是基于 Arm 的 CPU

    使用以下方法之一安装 .NET:

  • 使用 install-dotnet 脚本安装 .NET。
  • 手动安装 .NET
  • 支持的分发

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

    注册 Microsoft 包存储库

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

    仅在 x64 体系结构上支持包管理器安装。 其他体系结构(如 Arm )必须通过其他某种方式安装 .NET,例如使用 安装程序脚本 手动安装

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

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

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

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

    # Get Ubuntu version
    declare repo_version=$(if command -v lsb_release &> /dev/null; then lsb_release -r -s; else grep -oP '(?<=^VERSION_ID=).+' /etc/os-release | tr -d '"'; fi)
    # Download Microsoft signing key and repository
    wget https://packages.microsoft.com/config/ubuntu/$repo_version/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.10 或 23.04。

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

    安装 .NET

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

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

    如果不创建 .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 的预览版和候选发布版本:

  • 使用 install-dotnet.sh 脚本安装
  • 手动提取二进制文件
  • 删除预览版本

    使用包管理器管理 .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 时可能会遇到的常见错误的信息。

    仅在 x64 体系结构上支持包管理器安装。 对于 Arm 等其他体系结构,必须通过其他一些方式安装 .NET,例如,通过 Snap 和安装程序脚本进行安装,或通过手动提取二进制文件进行安装。

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

  • 或者,通过 install-dotnet 脚本安装 .NET。
  • 手动安装 .NET
  • 找不到\无法安装某些包

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

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

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

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

  • {os-version}
    这表示你正在使用的发行版。 此项在以下 wget 命令中使用。 发行版是数值,如 Ubuntu 上的 20.04 或 Debian 上的 10

    首先,尝试清除包列表:

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

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

    sudo apt-get install -y gpg
    wget -O - https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o microsoft.asc.gpg
    sudo mv microsoft.asc.gpg /etc/apt/trusted.gpg.d/
    wget https://packages.microsoft.com/config/ubuntu/{os-version}/prod.list
    sudo mv prod.list /etc/apt/sources.list.d/microsoft-prod.list
    sudo chown root:root /etc/apt/trusted.gpg.d/microsoft.asc.gpg
    sudo chown root:root /etc/apt/sources.list.d/microsoft-prod.list
    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 或发布独立应用,则必须安装以下依赖项才能运行应用:

  • libc6
  • libgcc1
  • 适用于 22.x) 的 libgcc-s1 (
  • libgssapi-krb5-2
  • libicu55(针对 16.x)
  • libicu60(针对 18.x)
  • libicu66(适用于 20. x)
  • libicu70 (22.04)
  • libicu71 (22.10)
  • 适用于 22.x) 的 liblttng-ust1 (
  • 适用于 16.x) 的 libssl1.0.0 (
  • libssl1.1(适用于18.x、20.x)
  • 适用于 22.x) 的 libssl3 (
  • libstdc++6
  • 适用于 22.x) 的 libunwind8 (
  • zlib1g
  • 如果 .NET 应用使用 System.Drawing.Common 程序集,则还需要安装 libgdiplus。 由于 Linux 上不再支持 System.Drawing.Common,因此这仅适用于 .NET 6,并且需要设置 System.Drawing.EnableUnixSupport 运行时配置开关。

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

  • 如何为 .NET CLI 启用 Tab 自动补全
  • 教程:使用 Visual Studio Code 通过 .NET SDK 创建控制台应用程序
  •