Share via


Problemen met .NET-fouten oplossen met betrekking tot ontbrekende bestanden in Linux

Wanneer u .NET op Linux probeert te gebruiken, kunnen opdrachten zoals dotnet new en dotnet run mislukken met een bericht dat is gerelateerd aan een bestand dat niet wordt gevonden, zoals fxr, libhostfxr.soof FrameworkList.xml. Sommige foutberichten zijn mogelijk vergelijkbaar met de volgende items:

  • System.IO.FileNotFoundException

    System.IO.FileNotFoundException: kan bestand '//usr/share/dotnetpacks/Microsoft.NETCore.App.Ref/5.0.0/data/FrameworkList.xml' niet vinden.

  • Er is een fatale fout opgetreden.

    Er is een fatale fout opgetreden. Kan de vereiste bibliotheek libhostfxr.so niet vinden.

    or

    Er is een fatale fout opgetreden. De map [//usr/share/dotnethost/fxr] bestaat niet.

    or

    Er is een onherstelbare fout opgetreden. De map [//usr/share/dotnethost/fxr] bevat geen onderliggende mappen met versienummers.

  • Algemene berichten over dotnet niet gevonden

    Er kan een algemeen bericht worden weergegeven dat aangeeft dat de SDK niet is gevonden of dat het pakket al is geïnstalleerd.

Een symptoom van deze problemen is dat zowel de als /usr/share/dotnet de /usr/lib64/dotnet mappen zich op uw systeem bevinden.

Tip

Gebruik de dotnet --info opdracht om weer te geven welke SDK's en runtimes zijn geïnstalleerd. Zie Controleren of .NET al is geïnstalleerd voor meer informatie.

Wat gebeurt er

Deze fouten treden meestal op wanneer twee Linux-pakketopslagplaatsen .NET-pakketten bieden. Hoewel Microsoft een Linux-pakketopslagplaats biedt voor .NET-pakketten, bieden sommige Linux-distributies ook .NET-pakketten. Deze distributies zijn onder andere:

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

Als u .NET-pakketten uit twee verschillende bronnen combineert, ondervindt u waarschijnlijk problemen. De pakketten kunnen dingen op verschillende paden plaatsen en mogelijk anders worden gecompileerd.

Oplossingen

De oplossing voor deze problemen is het gebruik van .NET vanuit één pakketopslagplaats. Welke opslagplaats u moet kiezen en hoe u dit doet, verschilt per use-case en de Linux-distributie.

Mijn Linux-distributie biedt .NET-pakketten en ik wil ze gebruiken

  • Gebruikt u de Microsoft-opslagplaats voor andere pakketten, zoals PowerShell en MSSQL?

    • Ja

      Configureer uw pakketbeheerder om de .NET-pakketten uit de Microsoft-opslagplaats te negeren. Het is mogelijk dat u .NET hebt geïnstalleerd vanuit beide opslagplaatsen, dus u wilt een of meer opslagplaatsen kiezen.

      1. Verwijder de bestaande .NET-pakketten uit uw distributie. U wilt opnieuw beginnen en ervoor zorgen dat u ze niet installeert vanuit de verkeerde opslagplaats.

        sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. Configureer de Microsoft-opslagplaats om .NET-pakketten te negeren.

        echo 'excludepkgs=dotnet*,aspnet*,netstandard*' | sudo tee -a /etc/yum.repos.d/microsoft-prod.repo
        
      3. Installeer .NET opnieuw vanuit de pakketfeed van de distributie. Zie .NET installeren in Linux voor meer informatie.

    • Nee

      1. Verwijder de bestaande .NET-pakketten uit uw distributie. U wilt opnieuw beginnen en ervoor zorgen dat u ze niet installeert vanuit de verkeerde opslagplaats.

        sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. Verwijder de Microsoft-opslagplaatsfeed uit uw distributie.

        sudo dnf remove packages-microsoft-prod
        
      3. Installeer .NET opnieuw vanuit de pakketfeed van de distributie. Zie .NET installeren in Linux voor meer informatie.

  • Gebruikt u de Microsoft-opslagplaats voor andere pakketten, zoals PowerShell en MSSQL?

    • Ja

      Configureer uw pakketbeheerder om de .NET-pakketten uit de Microsoft-opslagplaats te negeren. Het is mogelijk dat u .NET hebt geïnstalleerd vanuit beide opslagplaatsen, dus u wilt een of meer opslagplaatsen kiezen.

      1. Verwijder de bestaande .NET-pakketten uit uw distributie. U wilt opnieuw beginnen en ervoor zorgen dat u ze niet installeert vanuit de verkeerde opslagplaats.

        sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. Maken /etc/apt/preferences, als deze nog niet bestaat.

        touch /etc/apt/preferences
        
      3. Open /etc/apt/preferences in een editor en voeg de volgende instellingen toe, waarmee wordt voorkomen dat pakketten beginnen met dotnet, aspnetcoreof netstandard afkomstig zijn uit de Microsoft-opslagplaats:

        Package: dotnet* aspnet* netstandard*
        Pin: origin "packages.microsoft.com"
        Pin-Priority: -10
        
      4. Installeer .NET opnieuw vanuit de pakketfeed van de distributie. Zie .NET installeren in Linux voor meer informatie.

    • Nee

      1. Verwijder de bestaande .NET-pakketten uit uw distributie. U wilt opnieuw beginnen en ervoor zorgen dat u ze niet installeert vanuit de verkeerde opslagplaats.

        sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. Verwijder de Microsoft-opslagplaatsfeed uit uw distributie.

        sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list
        sudo apt update
        
      3. Installeer .NET opnieuw vanuit de pakketfeed van de distributie. Zie .NET installeren in Linux voor meer informatie.

Ik heb een versie van .NET nodig die niet wordt geleverd door mijn Linux-distributie

Configureer uw pakketbeheerder om de .NET-pakketten uit de opslagplaats van de distributie te negeren. Het is mogelijk dat u .NET hebt geïnstalleerd vanuit beide opslagplaatsen, dus u wilt een of meer opslagplaatsen kiezen.

  1. Verwijder de bestaande .NET-pakketten uit uw distributie. U wilt opnieuw beginnen en ervoor zorgen dat u ze niet installeert vanuit de verkeerde opslagplaats.

    sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
    
  2. Configureer de Linux-opslagplaats om .NET-pakketten te negeren.

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

    Zorg ervoor dat u vervangt door <your-package-source> de pakketbron van uw distributie.

  3. Installeer .NET opnieuw vanuit de pakketfeed van de distributie. Zie .NET installeren in Linux voor meer informatie.

Configureer uw pakketbeheerder om de .NET-pakketten uit de opslagplaats van de distributie te negeren. Het is mogelijk dat u .NET hebt geïnstalleerd vanuit beide opslagplaatsen, dus u wilt een of meer opslagplaatsen kiezen.

  1. Verwijder de bestaande .NET-pakketten uit uw distributie. U wilt opnieuw beginnen en ervoor zorgen dat u ze niet installeert vanuit de verkeerde opslagplaats.

    sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
    
  2. Maken /etc/apt/preferences, als deze nog niet bestaat.

    touch /etc/apt/preferences
    
  3. Open /etc/apt/preferences in een editor en voeg een apt voorkeurenfragmentatie toe om te voorkomen dat pakketten beginnen met dotnet, aspnetcoreof netstandard afkomstig zijn uit de opslagplaats van de distributie.

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

    Zorg ervoor dat u vervangt door <your-package-source> de pakketbron van uw distributie.

    Uw distributie heeft mogelijk meer dan één pakketbron.

    Op Ubuntu in de VS moet u bijvoorbeeld mogelijk één fragment voor archive.ubuntu.com en een ander fragment gebruiken voor security.ubuntu.com. Scheid elk fragment met een lege regel als volgt:

    Package: dotnet* aspnet* netstandard*
    Pin: origin "archive.ubuntu.com"
    Pin-Priority: -10
    
    Package: dotnet* aspnet* netstandard*
    Pin: origin "security.ubuntu.com"
    Pin-Priority: -10
    

    Tip

    Gebruik de apt-cache policy opdracht om de bron te vinden:

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

    Tip

    Als u de pakketopslagplaats ubuntu .NET-backports hebt geregistreerd, moet u de registratie van de pakketopslagplaats voor Ubuntu .NET-backports ongedaan maken in plaats van uw pakketbeheerder te configureren om de ingesloten .NET-pakketten te negeren. Anders haalt uw pakketbeheerder de pakketindex op uit deze opslagplaats, gewoon om deze te negeren, omdat de opslagplaats alleen .NET-pakketten bevat. Dit vertraagt het bijwerken van uw lokale pakketindex elke keer dat u belt apt update.

    Gebruik de apt-cache policy opdracht om te controleren of u de pakketopslagplaats ubuntu .NET-backports hebt geregistreerd:

    apt-cache policy '?name(dotnet.*)' | grep 'ppa.launchpadcontent.net/dotnet/backports' | sort -u
    
  4. Installeer .NET opnieuw vanuit de Microsoft-pakketfeed. Zie .NET installeren in Linux voor meer informatie. Als u Ubuntu gebruikt, raadpleegt u Mijn Ubuntu-distributie niet de gewenste .NET-versie of heb ik een niet-ondersteunende .NET-versie nodig.

Onlineverwijzingen

Veel andere gebruikers hebben deze problemen gemeld. Hier volgt een lijst met deze problemen. U kunt deze lezen voor inzicht in wat er kan gebeuren:

Zie ook