Skip to content

Ubuntu 中解决 dotnet 主机框架路径缺失错误详解

问题描述

在 Ubuntu 系统(特别是 22.04 版本)上安装或更新 .NET SDK 后运行任何 dotnet 命令时,系统报错:

A fatal error occurred. The folder [/usr/share/dotnet/host/fxr] does not exist

此错误会导致无法使用任何 .NET CLI 工具(如 dotnet build, dotnet run 等)。该问题通常发生在以下情况后:

  • 执行系统更新(sudo apt upgrade
  • 安装新版 .NET SDK
  • 系统中存在来自不同来源(Microsoft 官方源和 Ubuntu 官方仓库)的 .NET 混合安装

错误根源分析

该错误的根本原因是包源冲突

  1. Linux 上存在两种安装源:

    • Microsoft 官方软件源(通过 packages.microsoft.com 提供)
    • Ubuntu 官方仓库(通过 archive.ubuntu.com/security.ubuntu.com 提供)
  2. 混合使用这两种源会导致:

    • 软件包分散在不同位置
    • 关键运行时组件(host/fxr)路径缺失
    • .NET 运行时版本解析失败

注意

自 .NET 9 起,Microsoft 将不再为 Ubuntu 发布 .NET 包官方声明),使用 Ubuntu 官方包将是未来趋势。

解决方案

根据需求选择合适的解决方案:

📌 方案一:优先使用 Microsoft 官方包(适合需要最新版本开发者)

此方案通过 APT 优先级设置,确保优先使用 Microsoft 官方源安装 .NET。

操作步骤:

  1. 彻底卸载现有 .NET

    bash
    sudo apt remove dotnet* aspnetcore* netstandard*
    sudo apt autoremove
  2. 创建优先级配置文件

    bash
    sudo nano /etc/apt/preferences.d/99microsoft-dotnet.pref

    文件内容:

    text
    Package: dotnet* aspnet* netstandard*
    Pin: origin "archive.ubuntu.com"
    Pin-Priority: -10
    
    Package: dotnet* aspnet* netstandard*
    Pin: origin "security.ubuntu.com"
    Pin-Priority: -10
  3. 重新安装所需 .NET 版本

    bash
    sudo apt update
    sudo apt install dotnet-sdk-8.0  # 替换为所需版本
  4. 验证安装

    bash
    dotnet --info

优势

  • 可使用最新的 .NET SDK 版本
  • 保留 Microsoft 源的其他工具(如 PowerShell)

📌 方案二:完全切换至 Ubuntu 官方包(推荐普通用户和生产环境)

此方案专注于使用 Ubuntu 官方仓库提供更稳定、无冲突的 .NET 安装。

操作步骤:

  1. 卸载现有 .NET 和源配置

    bash
    sudo apt remove dotnet* aspnetcore* netstandard*
    sudo rm /etc/apt/sources.list.d/microsoft-prod.list
    sudo rm /etc/apt/sources.list.d/mssql-release.list  # 如果有
  2. 清理缓存并更新

    bash
    sudo apt autoremove
    sudo apt update
  3. 从 Ubuntu 仓库安装

    bash
    sudo apt install dotnet-sdk-8.0  # 替换为所需版本
  4. 验证安装

    bash
    dotnet --version

优势

  • 避免版本冲突问题
  • 系统依赖关系更简洁
  • Microsoft 官方推荐的未来方向

其他场景解决方案

🖥 MacOS 用户解决方案

若通过 MacPorts 安装出现相同错误:

bash
sudo port install dotnet-cli
sudo port install dotnet-runtime-8  # 匹配SDK版本
sudo port install dotnet-sdk-8      # 三者缺一不可

🧰 Visual Studio Code Dev Container 解决方案

.devcontainer.json 中指定稳定版本:

json
{
  "image": "mcr.microsoft.com/devcontainers/base:ubuntu-20.04" 
}

⚠️ 残留配置彻底清理方案

当常规方法失效时执行深度清理:

bash
sudo apt purge dotnet* aspnetcore* netstandard*
sudo rm -f /etc/apt/sources.list.d/microsoft-* 
sudo rm -f /etc/apt/sources.list.d/mssql-* 
sudo apt update
sudo apt upgrade  # 必做关键步骤
sudo apt install dotnet-sdk-8.0

验证安装成功

安装完成后运行以下命令确认功能完整:

bash
dotnet --version
bash
dotnet --list-sdks
bash
dotnet --info

最佳实践建议

  1. 统一安装来源

    • 从同一源安装所有 .NET 相关组件
    • 避免 apt install dotnet-host 这类部分安装命令
  2. 定期维护

    bash
    sudo apt autoremove  # 移除无用包
    sudo apt update      # 更新包索引
  3. 优先考虑 Ubuntu 源

    bash
    apt-cache policy dotnet-sdk-8.0  # 检查包来源
  4. 及时清理旧版本

    bash
    sudo apt remove dotnet-sdk-7.0   # 需要时移除旧版本

参考资源