Rozwiązywanie problemów z błędami platformy .NET związanymi z brakującymi plikami w systemie Linux
Podczas próby użycia platformy .NET w systemie Linux polecenia, takie jak dotnet new
i dotnet run
mogą zakończyć się niepowodzeniem z komunikatem związanym z nieznajdącym się plikiem, takim jak fxr, libhostfxr.solub FrameworkList.xml. Niektóre komunikaty o błędach mogą być podobne do następujących elementów:
System.IO.FileNotFoundException
System.IO.FileNotFoundException: Nie można odnaleźć pliku '//usr/share/dotnetpacks/Microsoft.NETCore.App.Ref/5.0.0/data/FrameworkList.xml'.
Wystąpił błąd krytyczny.
Wystąpił błąd krytyczny. Nie można odnaleźć wymaganej biblioteki libhostfxr.so .
lub
Wystąpił błąd krytyczny. Folder [//usrshare//dotnethost/fxr] nie istnieje.
lub
Wystąpił błąd krytyczny, folder [//usrshare//dotnethost/fxr] nie zawiera żadnych folderów podrzędnych z numerem wersji.
Komunikaty ogólne dotyczące dotnet nie znaleziono
Może pojawić się komunikat ogólny wskazujący, że zestaw SDK nie został znaleziony lub że pakiet został już zainstalowany.
Jednym z objawów tych problemów jest to, że zarówno foldery /usr/lib64/dotnet
, jak i /usr/share/dotnet
znajdują się w systemie.
Napiwek
Użyj polecenia , dotnet --info
aby wyświetlić listę zainstalowanych zestawów SDK i środowisk uruchomieniowych. Aby uzyskać więcej informacji, zobacz Jak sprawdzić, czy platforma .NET jest już zainstalowana.
Co się dzieje
Ważne
Począwszy od platformy .NET 9, firma Microsoft publikuje tylko pakiety dla obsługiwanych dystrybucji systemu Linux, które nie publikują własnych pakietów. Aby uzyskać więcej informacji, zobacz Instalowanie platformy .NET w systemie Linux.
Te błędy zwykle występują, gdy dwa repozytoria pakietów systemu Linux udostępniają pakiety .NET. Chociaż firma Microsoft udostępnia repozytorium pakietów systemu Linux do źródłowych pakietów .NET, niektóre dystrybucje systemu Linux udostępniają również pakiety .NET. Te dystrybucje obejmują:
- Alpine Linux
- Łuk
- Strumień centOS
- Fedora
- RHEL
- Ubuntu 22.04+
Jeśli połączysz pakiety .NET z dwóch różnych źródeł, prawdopodobnie wystąpią problemy. Pakiety mogą umieszczać elementy w różnych ścieżkach i mogą być kompilowane inaczej.
Rozwiązania
Rozwiązaniem tych problemów jest użycie platformy .NET z jednego repozytorium pakietów. Które repozytorium należy wybrać i jak to zrobić, różni się w zależności od przypadku użycia i dystrybucji systemu Linux.
- Moja dystrybucja systemu Linux udostępnia pakiety .NET i chcę ich używać.
- Potrzebuję wersji platformy .NET, która nie jest dostarczana przez moją dystrybucję systemu Linux.
Moja dystrybucja systemu Linux udostępnia pakiety .NET i chcę ich używać
Czy używasz repozytorium Firmy Microsoft dla innych pakietów, takich jak program PowerShell i program MSSQL?
Tak
Skonfiguruj menedżera pakietów tak, aby ignorował pakiety .NET z repozytorium firmy Microsoft. Możliwe, że zainstalowano platformę .NET z obu repozytoriów, więc chcesz wybrać jedną lub drugą.
Usuń istniejące pakiety .NET z dystrybucji. Chcesz zacząć od nowa i upewnić się, że nie instalujesz ich z nieprawidłowego repozytorium.
sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
Skonfiguruj repozytorium firmy Microsoft tak, aby ignorowało pakiety .NET.
echo 'excludepkgs=dotnet*,aspnet*,netstandard*' | sudo tee -a /etc/yum.repos.d/microsoft-prod.repo
Zainstaluj ponownie platformę .NET z kanału informacyjnego pakietów dystrybucji. Aby uzyskać więcej informacji, zobacz Instalowanie platformy .NET w systemie Linux.
Nie
Usuń istniejące pakiety .NET z dystrybucji. Chcesz zacząć od nowa i upewnić się, że nie instalujesz ich z nieprawidłowego repozytorium.
sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
Usuń źródło danych repozytorium firmy Microsoft z dystrybucji.
sudo dnf remove packages-microsoft-prod
Zainstaluj ponownie platformę .NET z kanału informacyjnego pakietów dystrybucji. Aby uzyskać więcej informacji, zobacz Instalowanie platformy .NET w systemie Linux.
Czy używasz repozytorium Firmy Microsoft dla innych pakietów, takich jak program PowerShell i program MSSQL?
Tak
Skonfiguruj menedżera pakietów tak, aby ignorował pakiety .NET z repozytorium firmy Microsoft. Możliwe, że zainstalowano platformę .NET z obu repozytoriów, więc chcesz wybrać jedną lub drugą.
Usuń istniejące pakiety .NET z dystrybucji. Chcesz zacząć od nowa i upewnić się, że nie instalujesz ich z nieprawidłowego repozytorium.
sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
Utwórz
/etc/apt/preferences
plik , jeśli jeszcze nie istnieje.touch /etc/apt/preferences
Otwórz
/etc/apt/preferences
plik w edytorze i dodaj następujące ustawienia, które uniemożliwiają uruchamianie pakietów rozpoczynających się oddotnet
,aspnetcore
lubnetstandard
z repozytorium firmy Microsoft:Package: dotnet* aspnet* netstandard* Pin: origin "packages.microsoft.com" Pin-Priority: -10
Zainstaluj ponownie platformę .NET z kanału informacyjnego pakietów dystrybucji. Aby uzyskać więcej informacji, zobacz Instalowanie platformy .NET w systemie Linux.
Nie
Usuń istniejące pakiety .NET z dystrybucji. Chcesz zacząć od nowa i upewnić się, że nie instalujesz ich z nieprawidłowego repozytorium.
sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
Usuń źródło danych repozytorium firmy Microsoft z dystrybucji.
sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list sudo apt update
Zainstaluj ponownie platformę .NET z kanału informacyjnego pakietów dystrybucji. Aby uzyskać więcej informacji, zobacz Instalowanie platformy .NET w systemie Linux.
Potrzebuję wersji platformy .NET, która nie jest dostarczana przez dystrybucję systemu Linux
Skonfiguruj menedżera pakietów tak, aby ignorował pakiety .NET z repozytorium dystrybucji. Możliwe, że zainstalowano platformę .NET z obu repozytoriów, więc chcesz wybrać jedną lub drugą.
Usuń istniejące pakiety .NET z dystrybucji. Chcesz zacząć od nowa i upewnić się, że nie instalujesz ich z nieprawidłowego repozytorium.
sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
Skonfiguruj repozytorium systemu Linux, aby ignorować pakiety platformy .NET.
echo 'excludepkgs=dotnet*,aspnet*,netstandard*' | sudo tee -a /etc/yum.repos.d/<your-package-source>.repo
Pamiętaj, aby zastąpić
<your-package-source>
element źródłem pakietu dystrybucji.Zainstaluj ponownie platformę .NET z kanału informacyjnego pakietów dystrybucji. Aby uzyskać więcej informacji, zobacz Instalowanie platformy .NET w systemie Linux.
Skonfiguruj menedżera pakietów tak, aby ignorował pakiety .NET z repozytorium dystrybucji. Możliwe, że zainstalowano platformę .NET z obu repozytoriów, więc chcesz wybrać jedną lub drugą.
Usuń istniejące pakiety .NET z dystrybucji. Chcesz zacząć od nowa i upewnić się, że nie instalujesz ich z nieprawidłowego repozytorium.
sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
Utwórz
/etc/apt/preferences
plik , jeśli jeszcze nie istnieje.touch /etc/apt/preferences
Otwórz
/etc/apt/preferences
plik w edytorze i dodaj fragment preferencji apt, aby zapobiec tworzeniu pakietów rozpoczynających się oddotnet
,aspnetcore
lubnetstandard
z repozytorium dystrybucji.Package: dotnet* aspnet* netstandard* Pin: origin "<your-package-source>" Pin-Priority: -10
Pamiętaj, aby zastąpić
<your-package-source>
element źródłem pakietu dystrybucji.Dystrybucja może mieć więcej niż jedno źródło pakietu.
Na przykład w systemie Ubuntu w Stanach Zjednoczonych może być konieczne użycie jednego fragmentu dla
archive.ubuntu.com
elementu i innego dla elementusecurity.ubuntu.com
. Oddziel każdy fragment pustym wierszem w następujący sposób:Package: dotnet* aspnet* netstandard* Pin: origin "archive.ubuntu.com" Pin-Priority: -10 Package: dotnet* aspnet* netstandard* Pin: origin "security.ubuntu.com" Pin-Priority: -10
Napiwek
Użyj polecenia ,
apt-cache policy
aby znaleźć źródło:apt-cache policy '?name(dotnet.*)' | grep -v microsoft | grep '/ubuntu' | cut -d"/" -f3 | sort -u
Napiwek
Jeśli zarejestrowano repozytorium pakietów backports systemu Ubuntu .NET, należy wyrejestrować repozytorium pakietów backports platformy Ubuntu .NET zamiast konfigurować menedżera pakietów w celu ignorowania zawartych pakietów .NET. W przeciwnym razie menedżer pakietów ściąga indeks pakietu z tego repozytorium, aby go zignorować, ponieważ repozytorium zawiera tylko pakiety .NET. To skutecznie spowalnia aktualizowanie lokalnego indeksu pakietów za każdym razem, gdy wywołasz metodę
apt update
.apt-cache policy
Użyj polecenia , aby sprawdzić, czy zarejestrowano repozytorium pakietów backports platformy Ubuntu .NET:apt-cache policy '?name(dotnet.*)' | grep 'ppa.launchpadcontent.net/dotnet/backports' | sort -u
Zainstaluj ponownie platformę .NET z kanału informacyjnego pakietów firmy Microsoft. Aby uzyskać więcej informacji, zobacz Instalowanie platformy .NET w systemie Linux. Jeśli używasz systemu Ubuntu, zobacz Moja dystrybucja systemu Ubuntu nie zawiera żądanej wersji platformy .NET lub potrzebuję wersji platformy .NET, która nie jest obsługiwana.
Odwołania online
Wielu innych użytkowników zgłosiło te problemy. Poniżej znajduje się lista tych problemów. Możesz je przeczytać, aby uzyskać szczegółowe informacje na temat tego, co może się zdarzyć:
System.IO.FileNotFoundExceptionand "/usr//dotnetshare/packs/Microsoft.NETCore.App.Ref/5.0.0/data/FrameworkList.xml"
- Zestaw SDK #15785: nie można skompilować nowego projektu po uaktualnieniu do wersji 5.0.3
- Zestaw SDK #15863: zadanie "MSB4018 ResolveTargetingPackAssets nieoczekiwanie nie powiodło się" po aktualizacji do wersji 5.0.103
- Zestaw SDK nr 17411: dotnet kompilacja zawsze zgłasza błąd
- Zestaw SDK nr 12075: dotnet 3.1.301 w usłudze Fedora 32 nie można odnaleźć FrameworkList.xml , ponieważ nie istnieje
Błąd krytyczny: libhostfxr.so nie można odnaleźć
Błąd krytyczny: folder /host/fxr nie istnieje
Błąd krytyczny: folder /host/fxr nie zawiera żadnych folderów podrzędnych numerowanych wersjami
- Instalator #9254: Błąd podczas instalacji dotnet/core/aspnet:3.1 w systemie CentOS 8 — folder nie zawiera żadnych folderów podrzędnych numerowanych wersjami
- StackOverflow: Błąd podczas instalacji dotnet/core/aspnet:3.1 w systemie CentOS 8 — folder nie zawiera żadnych folderów podrzędnych numerowanych w wersji
Błędy ogólne bez jasnych komunikatów
- Core #4605: nie można uruchomić "dotnet nowej konsoli"
- Core #4644: Nie można zainstalować zestawu .NET Core SDK 2.1 w usłudze Fedora 32
- Środowisko uruchomieniowe #49375: po aktualizacji do wersji 5.0.200-1 przy użyciu menedżera pakietów wydaje się, że nie zainstalowano żadnych zestawów SDK
- Instalator #16438: aplikacja "--version" nie istnieje