Problembehandlung bei .NET-Fehlern im Zusammenhang mit fehlenden Dateien unter Linux
Wenn Sie versuchen, .NET unter Linux zu verwenden, können Befehle wie dotnet new
und dotnet run
mit einer Meldung fehlschlagen, dass etwas nicht gefunden wurde, wie z. B. fxr, libhostfxr.so oder FrameworkList.xml. Einige der Fehlermeldungen können in etwa wie folgt lauten:
System.IO.FileNotFoundException
System.IO.FileNotFoundException: Datei „/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/5.0.0/data/FrameworkList.xml“ nicht gefunden.
Schwerwiegender Fehler
Schwerwiegender Fehler. Die erforderliche Bibliothek libhostfxr.so wurde nicht gefunden.
oder
Schwerwiegender Fehler. Der Ordner [/usr/share/dotnet/host/fxr] ist nicht vorhanden.
oder
Schwerwiegender Fehler: Der Ordner [/usr/share/dotnet/host/fxr] enthält keine untergeordneten Ordner mit Versionsnummer.
Generische Meldungen zu dotnetNicht gefunden
Möglicherweise wird eine allgemeine Meldung angezeigt, die angibt, dass das SDK nicht gefunden wurde, oder dass das Paket bereits installiert wurde.
Ein Symptom dieser Probleme ist, dass sich sowohl der Ordner /usr/lib64/dotnet
als auch /usr/share/dotnet
auf Ihrem System befindet.
Tipp
Verwenden Sie den Befehl dotnet --info
, um aufzulisten, welche SDKs und Runtimes installiert sind. Weitere Informationen finden Sie unter Überprüfen, ob .NET Core bereits installiert ist.
Woran liegt das?
Wichtig
Ab .NET 9 veröffentlicht Microsoft nur Pakete für unterstützte Linux-Distributionen, die keine eigenen Pakete veröffentlichen. Weitere Informationen finden Sie unter Installieren von .NET unter Linux.
Diese Fehler treten in der Regel auf, wenn zwei Linux-Paketrepositorys .NET-Pakete bereitstellen. Microsoft stellt ein Linux-Paketrepository für .NET-Quellpakete bereit, aber auch einige Linux-Distributionen stellen .NET-Pakete bereit. Zu diesen Distributionen gehören:
- Alpine Linux
- Arch
- CentOS Stream
- Fedora
- RHEL
- Ab Ubuntu 22.04
Wenn Sie .NET-Pakete aus zwei verschiedenen Quellen kombinieren, treten wahrscheinlich Probleme auf. Die Pakete können Komponenten unter verschiedenen Pfaden platzieren und möglicherweise unterschiedlich kompiliert werden.
Lösungen
Die Lösung für diese Probleme besteht darin, .NET aus einem Paketrepository zu verwenden. Welches Repository Sie auswählen und wie sie das durchführen, hängt vom Anwendungsfall und von der Linux-Distribution ab.
- Meine Linux-Distribution stellt .NET-Pakete bereit, und ich möchte sie verwenden.
- Ich benötige eine Version von .NET, die nicht von meiner Linux-Distribution bereitgestellt wird.
Meine Linux-Distribution stellt .NET-Pakete bereit, und ich möchte sie verwenden.
Verwenden Sie das Microsoft Repository für andere Pakete, wie PowerShell und MSSQL?
Ja
Konfigurieren Sie Ihren Paket-Manager so, dass er die .NET-Pakete aus dem Microsoft-Repository ignoriert. Es ist möglich, dass Sie .NET aus beiden Repositorys installiert haben, sodass Sie das eine oder das andere wählen sollten.
Entfernen Sie die vorhandenen .NET-Pakete aus Ihrer Distribution. Sie möchten neu beginnen und sicherstellen, dass Sie sie nicht aus dem falschen Repository installieren.
sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
Konfigurieren Sie das Microsoft-Repository so, dass .NET-Pakete ignoriert werden.
echo 'excludepkgs=dotnet*,aspnet*,netstandard*' | sudo tee -a /etc/yum.repos.d/microsoft-prod.repo
Installieren Sie .NET aus dem Paketfeed der Distribution erneut. Weitere Informationen finden Sie unter Installieren von .NET unter Linux.
Nein
Entfernen Sie die vorhandenen .NET-Pakete aus Ihrer Distribution. Sie möchten neu beginnen und sicherstellen, dass Sie sie nicht aus dem falschen Repository installieren.
sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
Löschen Sie den Microsoft-Repositoryfeed aus Ihrer Distribution.
sudo dnf remove packages-microsoft-prod
Installieren Sie .NET aus dem Paketfeed der Distribution erneut. Weitere Informationen finden Sie unter Installieren von .NET unter Linux.
Verwenden Sie das Microsoft Repository für andere Pakete, wie PowerShell und MSSQL?
Ja
Konfigurieren Sie Ihren Paket-Manager so, dass er die .NET-Pakete aus dem Microsoft-Repository ignoriert. Es ist möglich, dass Sie .NET aus beiden Repositorys installiert haben, sodass Sie das eine oder das andere wählen sollten.
Entfernen Sie die vorhandenen .NET-Pakete aus Ihrer Distribution. Sie möchten neu beginnen und sicherstellen, dass Sie sie nicht aus dem falschen Repository installieren.
sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
Erstellen Sie
/etc/apt/preferences
, falls noch nicht vorhanden.touch /etc/apt/preferences
Öffnen Sie
/etc/apt/preferences
in einem Editor und legen Sie die folgenden Einstellungen fest, die verhindern, dass Pakete, die mitdotnet
,aspnetcore
odernetstandard
beginnen, aus dem Microsoft-Repository bezogen werden:Package: dotnet* aspnet* netstandard* Pin: origin "packages.microsoft.com" Pin-Priority: -10
Installieren Sie .NET aus dem Paketfeed der Distribution erneut. Weitere Informationen finden Sie unter Installieren von .NET unter Linux.
Nein
Entfernen Sie die vorhandenen .NET-Pakete aus Ihrer Distribution. Sie möchten neu beginnen und sicherstellen, dass Sie sie nicht aus dem falschen Repository installieren.
sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
Löschen Sie den Microsoft-Repositoryfeed aus Ihrer Distribution.
sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list sudo apt update
Installieren Sie .NET aus dem Paketfeed der Distribution erneut. Weitere Informationen finden Sie unter Installieren von .NET unter Linux.
Ich benötige eine Version von .NET, die nicht von meiner Linux-Distribution bereitgestellt wird.
Konfigurieren Sie Ihren Paket-Manager so, dass er die .NET-Pakete aus dem Repository der Distribution ignoriert. Es ist möglich, dass Sie .NET aus beiden Repositorys installiert haben, sodass Sie das eine oder das andere wählen sollten.
Entfernen Sie die vorhandenen .NET-Pakete aus Ihrer Distribution. Sie möchten neu beginnen und sicherstellen, dass Sie sie nicht aus dem falschen Repository installieren.
sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
Konfigurieren Sie das Linux-Repository so, dass .NET-Pakete ignoriert werden.
echo 'excludepkgs=dotnet*,aspnet*,netstandard*' | sudo tee -a /etc/yum.repos.d/<your-package-source>.repo
Stellen Sie sicher, dass Sie
<your-package-source>
durch die Paketquelle Ihrer Distribution ersetzen.Installieren Sie .NET aus dem Paketfeed der Distribution erneut. Weitere Informationen finden Sie unter Installieren von .NET unter Linux.
Konfigurieren Sie Ihren Paket-Manager so, dass er die .NET-Pakete aus dem Repository der Distribution ignoriert. Es ist möglich, dass Sie .NET aus beiden Repositorys installiert haben, sodass Sie das eine oder das andere wählen sollten.
Entfernen Sie die vorhandenen .NET-Pakete aus Ihrer Distribution. Sie möchten neu beginnen und sicherstellen, dass Sie sie nicht aus dem falschen Repository installieren.
sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
Erstellen Sie
/etc/apt/preferences
, falls noch nicht vorhanden.touch /etc/apt/preferences
Öffnen Sie
/etc/apt/preferences
in einem Editor, und fügen Sie ein passendes Einstellungsfragment hinzu, um zu verhindern, dass Pakete, die mitdotnet
demaspnetcore
Repository der Verteilung beginnen, odernetstandard
aus dem Repository der Verteilung stammen.Package: dotnet* aspnet* netstandard* Pin: origin "<your-package-source>" Pin-Priority: -10
Stellen Sie sicher, dass Sie
<your-package-source>
durch die Paketquelle Ihrer Distribution ersetzen.Ihre Verteilung verfügt möglicherweise über mehrere Paketquellen.
Beispielsweise müssen Sie auf Ubuntu in den USA möglicherweise ein Fragment für
archive.ubuntu.com
und ein anderes fürsecurity.ubuntu.com
verwenden. Trennen Sie die Fragmente durch eine leere Zeile wie folgt:Package: dotnet* aspnet* netstandard* Pin: origin "archive.ubuntu.com" Pin-Priority: -10 Package: dotnet* aspnet* netstandard* Pin: origin "security.ubuntu.com" Pin-Priority: -10
Tipp
Verwenden Sie den Befehl
apt-cache policy
, um die Quelle zu ermitteln:apt-cache policy '?name(dotnet.*)' | grep -v microsoft | grep '/ubuntu' | cut -d"/" -f3 | sort -u
Tipp
Wenn Sie das Repository mit dem Ubuntu .NET Backports-Paket registriert haben, sollten Sie die Registrierung des Repositorys mit dem Ubuntu .NET-Backports-Paket aufheben, anstatt den Paket-Manager so zu konfigurieren, dass die enthaltenen .NET-Pakete ignoriert werden. Andernfalls ruft der Paket-Manager den Paketindex aus diesem Repository ab, nur um ihn zu ignorieren, da das Repository nur .NET-Pakete enthält. Dadurch wird das Aktualisieren des lokalen Paketindex bei jedem Aufruf von
apt update
verlangsamt.Verwenden Sie den Befehl
apt-cache policy
, um zu überprüfen, ob das Repository mit dem Ubuntu .NET Backports-Paket registriert ist:apt-cache policy '?name(dotnet.*)' | grep 'ppa.launchpadcontent.net/dotnet/backports' | sort -u
Installieren Sie .NET aus dem Microsoft-Paketfeed neu. Weitere Informationen finden Sie unter Installieren von .NET unter Linux. Wenn Sie Ubuntu verwenden, finden Sie weitere Informationen unter Meine Ubuntu-Distribution enthält nicht die gewünschte .NET-Version oder ich benötige eine nicht mehr unterstützte .NET-Version.
Onlinereferenzen
Viele andere Benutzer haben über diese Probleme berichtet. Es folgt eine Liste der bekannten Probleme. Sie können sie durchlesen und so erfahren, was die Ursache Ihres Problems sein könnte:
System.IO.FileNotFoundException und „/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/5.0.0/data/FrameworkList.xml“
- SDK#15785: Nach dem Upgrade auf Version 5.0.3 kann kein neues Projekt erstellt werden.
- SDK#15863: „Unerwarteter Fehler beim MSB4018 ResolveTargetingPackAssets-Task“ nach dem Update auf Version 5.0.103
- SDK #17411: dotnet Build löst immer Fehler aus
- SDK #12075: dotnet 3.1.301 kann unter Fedora 32 FrameworkList.xml nicht finden, da es nicht vorhanden ist.
Schwerwiegender Fehler: libhostfxr.so nicht gefunden
Schwerwiegender Fehler: Der Ordner /host/fxr ist nicht vorhanden.
Schwerwiegender Fehler: Der Ordner /host/fxr enthält keine untergeordneten Ordner mit Versionsnummer.
- Installer #9254: Fehler bei der Installation von dotnet/core/aspnet:3.1 unter CentOS 8: Der Ordner enthält keine untergeordneten Ordner mit Versionsnummer.
- StackOverflow: Fehler bei der Installation von dotnet/core/aspnet:3.1 unter CentOS 8: Der Ordner enthält keine untergeordneten Ordner mit Versionsnummer.
Generische Fehler ohne eindeutige Meldungen
- Core #4605: „dotnet Neue Konsole“ kann nicht ausgeführt werden.
- Core #4644: .NET Core SDK 2.1 kann nicht unter Fedora 32 installiert werden.
- Runtime #49375: Nach dem Aktualisieren auf 5.0.200-1 mithilfe des Paket-Managers werden anscheinend keine SDKs installiert.
- Installer-Nr. 16438: Die Anwendung „--version“ ist nicht vorhanden