Устранение ошибок .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.
Что происходит
Внимание
Начиная с .NET 9 корпорация Майкрософт публикует пакеты только для поддерживаемых дистрибутивов Linux, которые не публикуют собственные пакеты. Дополнительные сведения см. в разделе "Установка .NET в Linux".
Эти ошибки обычно возникают, когда два репозитория пакетов Linux предоставляют пакеты .NET. Хотя корпорация Майкрософт предоставляет репозиторий пакетов Linux для исходных пакетов .NET, некоторые дистрибутивы Linux также предоставляют пакеты .NET. К этим дистрибутивам относятся:
- Alpine Linux
- Arch
- CentOS Stream
- Fedora
- RHEL
- Ubuntu 22.04+
Если вы смешиваете пакеты .NET из двух разных источников, скорее всего, возникнут проблемы. Пакеты могут размещать вещи по разным путям и скомпилироваться по-разному.
Решения
Решение этих проблем заключается в использовании .NET из одного репозитория пакетов. Выбор репозитория и его выполнение зависит от варианта использования и дистрибутива Linux.
- Мой дистрибутив Linux предоставляет пакеты .NET, и я хочу их использовать.
- Мне нужна версия .NET, которая не предоставляется дистрибутивом Linux.
Мой дистрибутив Linux предоставляет пакеты .NET, и я хочу использовать их
Вы используете репозиторий Майкрософт для других пакетов, таких как PowerShell и MSSQL?
Да
Настройте диспетчер пакетов, чтобы игнорировать пакеты .NET из репозитория Майкрософт. Возможно, вы установили .NET из обоих репозиториев, поэтому вы хотите выбрать один или другой.
Удалите существующие пакеты .NET из дистрибутива. Вы хотите начать работу и убедиться, что они не устанавливаются из неправильного репозитория.
sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
Настройте репозиторий Майкрософт, чтобы игнорировать пакеты .NET.
echo 'excludepkgs=dotnet*,aspnet*,netstandard*' | sudo tee -a /etc/yum.repos.d/microsoft-prod.repo
Переустановите .NET из веб-канала пакета дистрибутива. Дополнительные сведения см. в разделе "Установка .NET в Linux".
Нет
Удалите существующие пакеты .NET из дистрибутива. Вы хотите начать работу и убедиться, что они не устанавливаются из неправильного репозитория.
sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
Удалите веб-канал репозитория Майкрософт из дистрибутива.
sudo dnf remove packages-microsoft-prod
Переустановите .NET из веб-канала пакета дистрибутива. Дополнительные сведения см. в разделе "Установка .NET в Linux".
Вы используете репозиторий Майкрософт для других пакетов, таких как PowerShell и MSSQL?
Да
Настройте диспетчер пакетов, чтобы игнорировать пакеты .NET из репозитория Майкрософт. Возможно, вы установили .NET из обоих репозиториев, поэтому вы хотите выбрать один или другой.
Удалите существующие пакеты .NET из дистрибутива. Вы хотите начать работу и убедиться, что они не устанавливаются из неправильного репозитория.
sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
Создайте
/etc/apt/preferences
, если он еще не существует.touch /etc/apt/preferences
Откройте
/etc/apt/preferences
в редакторе и добавьте следующие параметры, которые препятствуют созданию пакетов, начинающихся сdotnet
,aspnetcore
илиnetstandard
из репозитория Майкрософт:Package: dotnet* aspnet* netstandard* Pin: origin "packages.microsoft.com" Pin-Priority: -10
Переустановите .NET из веб-канала пакета дистрибутива. Дополнительные сведения см. в разделе "Установка .NET в Linux".
Нет
Удалите существующие пакеты .NET из дистрибутива. Вы хотите начать работу и убедиться, что они не устанавливаются из неправильного репозитория.
sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
Удалите веб-канал репозитория Майкрософт из дистрибутива.
sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list sudo apt update
Переустановите .NET из веб-канала пакета дистрибутива. Дополнительные сведения см. в разделе "Установка .NET в Linux".
Мне нужна версия .NET, которая не предоставляется дистрибутивом Linux
Настройте диспетчер пакетов, чтобы игнорировать пакеты .NET из репозитория дистрибутива. Возможно, вы установили .NET из обоих репозиториев, поэтому вы хотите выбрать один или другой.
Удалите существующие пакеты .NET из дистрибутива. Вы хотите начать работу и убедиться, что они не устанавливаются из неправильного репозитория.
sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
Настройте репозиторий Linux, чтобы игнорировать пакеты .NET.
echo 'excludepkgs=dotnet*,aspnet*,netstandard*' | sudo tee -a /etc/yum.repos.d/<your-package-source>.repo
Обязательно замените
<your-package-source>
источник пакета дистрибутива.Переустановите .NET из веб-канала пакета дистрибутива. Дополнительные сведения см. в разделе "Установка .NET в Linux".
Настройте диспетчер пакетов, чтобы игнорировать пакеты .NET из репозитория дистрибутива. Возможно, вы установили .NET из обоих репозиториев, поэтому вы хотите выбрать один или другой.
Удалите существующие пакеты .NET из дистрибутива. Вы хотите начать работу и убедиться, что они не устанавливаются из неправильного репозитория.
sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
Создайте
/etc/apt/preferences
, если он еще не существует.touch /etc/apt/preferences
Откройте
/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
Переустановите .NET из веб-канала пакетов Майкрософт. Дополнительные сведения см. в разделе "Установка .NET в Linux". Если используется Ubuntu, см. раздел "Мой дистрибутив Ubuntu" не включает нужную версию .NET или не поддерживает версию .NET.
Источники в Интернете
Многие другие пользователи сообщили об этих проблемах. Ниже представлен список этих проблем. Вы можете ознакомиться с ними, чтобы узнать, что может происходить.
System.IO.FileNotFoundExceptionи "/usr//dotnetsharepacks/Microsoft.NETCore.App.Ref/5.0.0/data/FrameworkList.xml"
- № 15785 (пакет SDK): после обновления до версии 5.0.3 не удалось создать проект
- № 15863 (пакет SDK): после обновления до версии 5.0.103 возникает ошибка MSB4018 — произошел сбой задачи ResolveTargetingPackAssets
- № 17411 (пакет SDK): происходит ошибка сборки dotnet
- № 12075 (пакет SDK): в Fedora 32 dotnet 3.1.301 не удается найти файл FrameworkList.xml, так как он не существует
Неустранимая ошибка: не удалось найти libhostfxr.so
Неустранимая ошибка: папка /host/fxr не существует
Неустранимая ошибка. В папке /host/fxr нет дочерних папок с номерами версий
Общие ошибки без развернутых сообщений
- № 4605 (Core): не удается выполнить команду "dotnet new console"
- № 4644 (Core): не удается установить пакет SDK для .NET Core 2.1 в Fedora 32
- № 49375 (среда выполнения): после обновления до версии 5.0.200-1 с использованием диспетчера пакетов отображается сообщение о том, что нет установленных пакетов SDK
- Установщик #16438: приложение "-версия" не существует