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?

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
  • 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 legen Sie die folgenden Einstellungen fest, die 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, unter Ubuntu verwenden Sie in den USA z. B. archive.ubuntu.com.

    Tipp

    Verwenden Sie den Befehl apt-cache policy, um die Quelle zu ermitteln:

    apt-cache policy '~ndotnet.*' | grep -v microsoft | grep '/ubuntu' | grep updates | cut -d"/" -f3 | 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