Teilen über


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 (derzeit in der Vorschau) 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.

  • 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.

      1. 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*'
        
      2. 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
        
      3. Installieren Sie .NET aus dem Paketfeed der Distribution erneut. Weitere Informationen finden Sie unter Installieren von .NET unter Linux.

    • Nein

      1. 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*'
        
      2. Löschen Sie den Microsoft-Repositoryfeed aus Ihrer Distribution.

        sudo dnf remove packages-microsoft-prod
        
      3. 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.

      1. 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*'
        
      2. Erstellen Sie /etc/apt/preferences, falls noch nicht vorhanden.

        touch /etc/apt/preferences
        
      3. Öffnen Sie /etc/apt/preferences in einem Editor und legen Sie die folgenden Einstellungen fest, die verhindern, dass Pakete, die mit dotnet, aspnetcore oder netstandard beginnen, aus dem Microsoft-Repository bezogen werden:

        Package: dotnet* aspnet* netstandard*
        Pin: origin "packages.microsoft.com"
        Pin-Priority: -10
        
      4. Installieren Sie .NET aus dem Paketfeed der Distribution erneut. Weitere Informationen finden Sie unter Installieren von .NET unter Linux.

    • Nein

      1. 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*'
        
      2. Löschen Sie den Microsoft-Repositoryfeed aus Ihrer Distribution.

        sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list
        sudo apt update
        
      3. 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.

  1. 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*'
    
  2. 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.

  3. 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.

  1. 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*'
    
  2. Erstellen Sie /etc/apt/preferences, falls noch nicht vorhanden.

    touch /etc/apt/preferences
    
  3. Öffnen Sie /etc/apt/preferences in einem, Editor und fügen Sie ein apt-Einstellungsfragment hinzu, um zu verhindern, dass Pakete, die mit dotnet, aspnetcore oder netstandard beginnen, aus dem Repository der Distribution bezogen werden.

    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ür security.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
    
  4. 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:

Weitere Informationen