Бөлісу құралы:


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

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

  • System.IO.FileNotFoundException

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

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

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

    или

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

    или

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

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

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

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

Совет

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

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

Внимание

Начиная с .NET 9 корпорация Майкрософт публикует пакеты только для поддерживаемых дистрибутивов Linux, которые не публикуют собственные пакеты. Дополнительные сведения см. в разделе "Установка .NET в Linux".

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

  • Alpine Linux
  • Арка
  • CentOS Stream
  • Шляпа федора
  • RHEL (Red Hat Enterprise Linux)
  • 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 в редакторе и добавьте фрагмент параметров apt, чтобы предотвратить получение пакетов, начинающихся с dotnet, aspnetcore или netstandard, из репозитория дистрибутива.

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

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

    У дистрибутива может быть несколько источников пакетов.

    Например, в Ubuntu в США может потребоваться использовать один фрагмент для archive.ubuntu.com, а другой для security.ubuntu.com. Разделите каждый фрагмент с пустой строкой следующим образом:

    Package: dotnet* aspnet* netstandard*
    Pin: origin "archive.ubuntu.com"
    Pin-Priority: -10
    
    Package: dotnet* aspnet* netstandard*
    Pin: origin "security.ubuntu.com"
    Pin-Priority: -10
    

    Совет

    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, которая больше не поддерживается».

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

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

См. также