Felsöka .NET-fel som rör filer som saknas i Linux

När du försöker använda .NET på Linux kan kommandon som dotnet new och dotnet run misslyckas med ett meddelande som är relaterat till att en fil inte hittas, till exempel fxr, libhostfxr.soeller FrameworkList.xml. Vissa felmeddelanden kan likna följande:

  • System.IO.FileNotFoundException

    System.IO.FileNotFoundException: Det gick inte att hitta filen '/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/5.0.0/data/FrameworkList.xml'.

  • Ett allvarligt fel uppstod.

    Ett allvarligt fel uppstod. Det gick inte att hitta det nödvändiga biblioteket libhostfxr.so .

    eller

    Ett allvarligt fel uppstod. Mappen [//usr/share/dotnethost/fxr] finns inte.

    eller

    Ett allvarligt fel uppstod, mappen [//usrshare//dotnethost/fxr] innehåller inga underordnade mappar med versionsnummer.

  • Allmänna meddelanden om dotnet hittades inte

    Ett allmänt meddelande kan visas som anger att SDK inte hittas eller att paketet redan har installerats.

Ett symptom på dessa problem är att både mapparna /usr/lib64/dotnet och /usr/share/dotnet finns i systemet.

Dricks

dotnet --info Använd kommandot för att lista vilka SDK:er och Körningar som är installerade. Mer information finns i Så här kontrollerar du att .NET redan är installerat.

Vad är det som händer

Dessa fel uppstår vanligtvis när två Linux-paketlagringsplatser tillhandahåller .NET-paket. Medan Microsoft tillhandahåller en Linux-paketlagringsplats för att hämta .NET-paket, tillhandahåller vissa Linux-distributioner även .NET-paket. Dessa distributioner omfattar:

  • Alpine Linux
  • Arch
  • CentOS
  • CentOS Stream
  • Fedora
  • RHEL
  • Ubuntu 22.04+

Om du blandar .NET-paket från två olika källor stöter du förmodligen på problem. Paketen kan placera saker på olika sökvägar och kan kompileras på olika sätt.

Lösningar

Lösningen på dessa problem är att använda .NET från en paketlagringsplats. Vilken lagringsplats som ska väljas och hur du gör det varierar beroende på användningsfall och Linux-distribution.

Min Linux-distribution tillhandahåller .NET-paket och jag vill använda dem

  • Använder du Microsoft-lagringsplatsen för andra paket, till exempel PowerShell och MSSQL?

    • Ja

      Konfigurera pakethanteraren för att ignorera .NET-paketen från Microsoft-lagringsplatsen. Det är möjligt att du har installerat .NET från båda lagringsplatserna, så du vill välja det ena eller det andra.

      1. Ta bort befintliga .NET-paket från distributionen. Du vill börja om och se till att du inte installerar dem från fel lagringsplats.

        sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. Konfigurera Microsoft-lagringsplatsen för att ignorera .NET-paket.

        echo 'excludepkgs=dotnet*,aspnet*,netstandard*' | sudo tee -a /etc/yum.repos.d/microsoft-prod.repo
        
      3. Installera om .NET från distributionens paketflöde. Mer information finns i Installera .NET på Linux.

    • Nej

      1. Ta bort befintliga .NET-paket från distributionen. Du vill börja om och se till att du inte installerar dem från fel lagringsplats.

        sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. Ta bort Microsoft-lagringsplatsens feed från din distribution.

        sudo dnf remove packages-microsoft-prod
        
      3. Installera om .NET från distributionens paketflöde. Mer information finns i Installera .NET på Linux.

  • Använder du Microsoft-lagringsplatsen för andra paket, till exempel PowerShell och MSSQL?

    • Ja

      Konfigurera pakethanteraren för att ignorera .NET-paketen från Microsoft-lagringsplatsen. Det är möjligt att du har installerat .NET från båda lagringsplatserna, så du vill välja det ena eller det andra.

      1. Ta bort befintliga .NET-paket från distributionen. Du vill börja om och se till att du inte installerar dem från fel lagringsplats.

        sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. Skapa /etc/apt/preferences, om det inte redan finns.

        touch /etc/apt/preferences
        
      3. Öppna /etc/apt/preferences i ett redigeringsprogram och lägg till följande inställningar, vilket förhindrar att paket som börjar med dotnet, aspnetcoreeller netstandard hämtas från Microsoft-lagringsplatsen:

        Package: dotnet* aspnet* netstandard*
        Pin: origin "packages.microsoft.com"
        Pin-Priority: -10
        
      4. Installera om .NET från distributionens paketflöde. Mer information finns i Installera .NET på Linux.

    • Nej

      1. Ta bort befintliga .NET-paket från distributionen. Du vill börja om och se till att du inte installerar dem från fel lagringsplats.

        sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. Ta bort Microsoft-lagringsplatsens feed från din distribution.

        sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list
        sudo apt update
        
      3. Installera om .NET från distributionens paketflöde. Mer information finns i Installera .NET på Linux.

Jag behöver en version av .NET som inte tillhandahålls av min Linux-distribution

Konfigurera pakethanteraren för att ignorera .NET-paketen från distributionens lagringsplats. Det är möjligt att du har installerat .NET från båda lagringsplatserna, så du vill välja det ena eller det andra.

  1. Ta bort befintliga .NET-paket från distributionen. Du vill börja om och se till att du inte installerar dem från fel lagringsplats.

    sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
    
  2. Konfigurera Linux-lagringsplatsen för att ignorera .NET-paket.

    echo 'excludepkgs=dotnet*,aspnet*,netstandard*' | sudo tee -a /etc/yum.repos.d/<your-package-source>.repo
    

    Ersätt <your-package-source> med distributionens paketkälla.

  3. Installera om .NET från distributionens paketflöde. Mer information finns i Installera .NET på Linux.

Konfigurera pakethanteraren för att ignorera .NET-paketen från distributionens lagringsplats. Det är möjligt att du har installerat .NET från båda lagringsplatserna, så du vill välja det ena eller det andra.

  1. Ta bort befintliga .NET-paket från distributionen. Du vill börja om och se till att du inte installerar dem från fel lagringsplats.

    sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
    
  2. Skapa /etc/apt/preferences, om det inte redan finns.

    touch /etc/apt/preferences
    
  3. Öppna /etc/apt/preferences i en redigerare och lägg till följande inställningar, vilket förhindrar att paket som börjar med dotnet, aspnetcoreeller netstandard hämtas från distributionens lagringsplats.

    Package: dotnet* aspnet* netstandard*
    Pin: origin "<your-package-source>"
    Pin-Priority: -10
    

    Se till att ersätta <your-package-source> med din distributions paketkälla, till exempel på Ubuntu som du kan använda archive.ubuntu.com i USA.

    Dricks

    apt-cache policy Använd kommandot för att hitta källan:

    apt-cache policy '?name(dotnet.*)' | grep -v microsoft | grep '/ubuntu' | cut -d"/" -f3 | sort -u
    

    Dricks

    Om du har registrerat paketlagringsplatsen Ubuntu .NET-backports bör du avregistrera Ubuntu .NET-lagringsplatsen för .NET-backports i stället för att konfigurera pakethanteraren för att ignorera de inneslutna .NET-paketen. Annars hämtar pakethanteraren paketindexet från den här lagringsplatsen, bara för att ignorera det, eftersom lagringsplatsen bara innehåller .NET-paket. Detta gör det effektivt långsammare att uppdatera ditt lokala paketindex varje gång du anropar apt update.

    apt-cache policy Använd kommandot för att kontrollera om du har registrerat Ubuntu .NET-lagringsplatsen för backports-paketet:

    apt-cache policy '?name(dotnet.*)' | grep 'ppa.launchpadcontent.net/dotnet/backports' | sort -u
    
  4. Installera om .NET från Microsoft-paketflödet. Mer information finns i Installera .NET på Linux. Om du använder Ubuntu läser du Min Ubuntu-distribution innehåller inte den .NET-version jag vill ha, eller så behöver jag en .NET-version som inte stöds.

Onlinereferenser

Många andra användare har rapporterat dessa problem. Följande är en lista över dessa problem. Du kan läsa igenom dem för att få insikter om vad som kan hända:

Se även