Устранение ошибок .NET, связанных с отсутствующими файлами в Linux

При попытке использовать .NET в Linux команды, такие как dotnet new и dotnet run могут завершиться ошибкой, связанной с файлом, не найденным, например fxr, libhostfxr.soили FrameworkList.xml. Некоторые сообщения об ошибках могут быть похожи на следующие элементы:

  • System.IO.FileNotFoundException

    System.IO.FileNotFoundException: не удалось найти файл "/usr//dotnetsharepacks/Microsoft.NETCore.App.Ref/5.0.0/data/".FrameworkList.xml

  • Возникла неустранимая ошибка.

    Возникла неустранимая ошибка. Не удалось найти требуемую библиотеку libhostfxr.so.

    or

    Возникла неустранимая ошибка. Папка [//usr/sharedotnethost/fxr] не существует.

    or

    Произошла неустранимая ошибка, папка [/usr/share/dotnethost/fxr] не содержит дочерних папок с номером версии.

  • Общие сообщения о том, что данные dotnet не найдены

    Может отобразиться сообщение с общими сведениями о том, что пакет SDK не найден или что пакет уже установлен.

Одной из причин этих проблем может быть наличие и папки /usr/lib64/dotnet, и папки /usr/share/dotnet в вашей системе.

Совет

dotnet --info Используйте команду для перечисления установленных пакетов SDK и сред выполнения. Дополнительные сведения см. в статье Проверка того, установлена ли платформа .NET.

Что происходит

Эти ошибки обычно возникают, когда два репозитория пакетов Linux предоставляют пакеты .NET. Хотя корпорация Майкрософт предоставляет репозиторий пакетов Linux для исходных пакетов .NET, некоторые дистрибутивы Linux также предоставляют пакеты .NET. К этим дистрибутивам относятся:

  • Alpine Linux
  • Arch
  • CentOS
  • CentOS Stream
  • Fedora
  • RHEL
  • Ubuntu 22.04+

Если вы смешиваете пакеты .NET из двух разных источников, скорее всего, возникнут проблемы. Пакеты могут размещать вещи по разным путям и скомпилироваться по-разному.

Решения

Решение этих проблем заключается в использовании .NET из одного репозитория пакетов. Выбор репозитория и его выполнение зависит от варианта использования и дистрибутива Linux.

Мой дистрибутив Linux предоставляет пакеты .NET, и я хочу использовать их

  • Вы используете репозиторий Майкрософт для других пакетов, таких как PowerShell и MSSQL?

    • Да

      Настройте диспетчер пакетов, чтобы игнорировать пакеты .NET из репозитория Майкрософт. Возможно, вы установили .NET из обоих репозиториев, поэтому вы хотите выбрать один или другой.

      1. Удалите существующие пакеты .NET из дистрибутива. Вы хотите начать работу и убедиться, что они не устанавливаются из неправильного репозитория.

        sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. Настройте репозиторий Майкрософт, чтобы игнорировать пакеты .NET.

        echo 'excludepkgs=dotnet*,aspnet*,netstandard*' | sudo tee -a /etc/yum.repos.d/microsoft-prod.repo
        
      3. Переустановите .NET из веб-канала пакета дистрибутива. Дополнительные сведения см. в разделе "Установка .NET в Linux".

    • Нет

      1. Удалите существующие пакеты .NET из дистрибутива. Вы хотите начать работу и убедиться, что они не устанавливаются из неправильного репозитория.

        sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. Удалите веб-канал репозитория Майкрософт из дистрибутива.

        sudo dnf remove packages-microsoft-prod
        
      3. Переустановите .NET из веб-канала пакета дистрибутива. Дополнительные сведения см. в разделе "Установка .NET в Linux".

  • Вы используете репозиторий Майкрософт для других пакетов, таких как PowerShell и MSSQL?

    • Да

      Настройте диспетчер пакетов, чтобы игнорировать пакеты .NET из репозитория Майкрософт. Возможно, вы установили .NET из обоих репозиториев, поэтому вы хотите выбрать один или другой.

      1. Удалите существующие пакеты .NET из дистрибутива. Вы хотите начать работу и убедиться, что они не устанавливаются из неправильного репозитория.

        sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. Создайте /etc/apt/preferences, если он еще не существует.

        touch /etc/apt/preferences
        
      3. Откройте /etc/apt/preferences в редакторе и добавьте следующие параметры, которые препятствуют созданию пакетов, начинающихся с dotnet, aspnetcoreили netstandard из репозитория Майкрософт:

        Package: dotnet* aspnet* netstandard*
        Pin: origin "packages.microsoft.com"
        Pin-Priority: -10
        
      4. Переустановите .NET из веб-канала пакета дистрибутива. Дополнительные сведения см. в разделе "Установка .NET в Linux".

    • Нет

      1. Удалите существующие пакеты .NET из дистрибутива. Вы хотите начать работу и убедиться, что они не устанавливаются из неправильного репозитория.

        sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. Удалите веб-канал репозитория Майкрософт из дистрибутива.

        sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list
        sudo apt update
        
      3. Переустановите .NET из веб-канала пакета дистрибутива. Дополнительные сведения см. в разделе "Установка .NET в Linux".

Мне нужна версия .NET, которая не предоставляется дистрибутивом Linux

Настройте диспетчер пакетов, чтобы игнорировать пакеты .NET из репозитория дистрибутива. Возможно, вы установили .NET из обоих репозиториев, поэтому вы хотите выбрать один или другой.

  1. Удалите существующие пакеты .NET из дистрибутива. Вы хотите начать работу и убедиться, что они не устанавливаются из неправильного репозитория.

    sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
    
  2. Настройте репозиторий Linux, чтобы игнорировать пакеты .NET.

    echo 'excludepkgs=dotnet*,aspnet*,netstandard*' | sudo tee -a /etc/yum.repos.d/<your-package-source>.repo
    

    Обязательно замените <your-package-source> источник пакета дистрибутива.

  3. Переустановите .NET из веб-канала пакета дистрибутива. Дополнительные сведения см. в разделе "Установка .NET в Linux".

Настройте диспетчер пакетов, чтобы игнорировать пакеты .NET из репозитория дистрибутива. Возможно, вы установили .NET из обоих репозиториев, поэтому вы хотите выбрать один или другой.

  1. Удалите существующие пакеты .NET из дистрибутива. Вы хотите начать работу и убедиться, что они не устанавливаются из неправильного репозитория.

    sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
    
  2. Создайте /etc/apt/preferences, если он еще не существует.

    touch /etc/apt/preferences
    
  3. Откройте /etc/apt/preferences в редакторе и добавьте следующие параметры, которые препятствуют созданию пакетов, которые начинаются с dotnet, aspnetcoreили netstandard из репозитория дистрибутива.

    Package: dotnet* aspnet* netstandard*
    Pin: origin "<your-package-source>"
    Pin-Priority: -10
    

    Обязательно замените <your-package-source> источник пакета дистрибутива, например, в Ubuntu, который можно использовать archive.ubuntu.com в США.

    Совет

    apt-cache policy Используйте команду для поиска источника:

    apt-cache policy '?name(dotnet.*)' | grep -v microsoft | grep '/ubuntu' | cut -d"/" -f3 | sort -u
    

    Совет

    Если вы зарегистрировали репозиторий пакетов серверной части Ubuntu .NET, следует отменить регистрацию репозитория пакетов серверной части Ubuntu .NET вместо настройки диспетчера пакетов, чтобы игнорировать содержащиеся пакеты .NET. В противном случае диспетчер пакетов извлекает индекс пакета из этого репозитория, просто чтобы игнорировать его, так как репозиторий содержит только пакеты .NET. Это эффективно замедляет обновление индекса локального пакета при каждом вызове apt update.

    apt-cache policy Используйте команду, чтобы проверка, если вы зарегистрировали репозиторий пакетов серверной части Ubuntu .NET:

    apt-cache policy '?name(dotnet.*)' | grep 'ppa.launchpadcontent.net/dotnet/backports' | sort -u
    
  4. Переустановите .NET из веб-канала пакетов Майкрософт. Дополнительные сведения см. в разделе "Установка .NET в Linux". Если используется Ubuntu, см. раздел "Мой дистрибутив Ubuntu" не включает нужную версию .NET или не поддерживает версию .NET.

Источники в Интернете

Многие другие пользователи сообщили об этих проблемах. Ниже представлен список этих проблем. Вы можете ознакомиться с ними, чтобы узнать, что может происходить.

См. также