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
Belangrijk
Vanaf .NET 9 publiceert Microsoft alleen pakketten voor ondersteunde Linux-distributies die hun eigen pakketten niet publiceren. Zie .NET installeren in Linux voor meer informatie.
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
- Boog
- 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.
- Ik heb een versie van .NET nodig die niet wordt geleverd door mijn 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.
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*'
Configureer de Microsoft-opslagplaats om .NET-pakketten te negeren.
echo 'excludepkgs=dotnet*,aspnet*,netstandard*' | sudo tee -a /etc/yum.repos.d/microsoft-prod.repo
Installeer .NET opnieuw vanuit de pakketfeed van de distributie. Zie .NET installeren in Linux voor meer informatie.
Nee
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*'
Verwijder de Microsoft-opslagplaatsfeed uit uw distributie.
sudo dnf remove packages-microsoft-prod
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.
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*'
Maken
/etc/apt/preferences
, als deze nog niet bestaat.touch /etc/apt/preferences
Open
/etc/apt/preferences
in een editor en voeg de volgende instellingen toe, waarmee wordt voorkomen dat pakketten beginnen metdotnet
,aspnetcore
ofnetstandard
afkomstig zijn uit de Microsoft-opslagplaats:Package: dotnet* aspnet* netstandard* Pin: origin "packages.microsoft.com" Pin-Priority: -10
Installeer .NET opnieuw vanuit de pakketfeed van de distributie. Zie .NET installeren in Linux voor meer informatie.
Nee
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*'
Verwijder de Microsoft-opslagplaatsfeed uit uw distributie.
sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list sudo apt update
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.
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*'
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.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.
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*'
Maken
/etc/apt/preferences
, als deze nog niet bestaat.touch /etc/apt/preferences
Open
/etc/apt/preferences
in een editor en voeg een apt-voorkeurenfragment toe om te voorkomen dat pakketten beginnen metdotnet
,aspnetcore
ofnetstandard
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 voorsecurity.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
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:
System.IO.FileNotFoundException en /usr//share/dotnetpacks/Microsoft.NETCore.App.Ref/5.0.0/data/FrameworkList.xml'
- SDK #15785: kan geen gloednieuw project bouwen na een upgrade naar 5.0.3
- SDK #15863: 'MSB4018 ResolveTargetingPackAssets-taak is onverwacht mislukt' na het bijwerken naar 5.0.103
- SDK #17411: dotnet build genereert altijd een fout
- SDK #12075: dotnet 3.1.301 op Fedora 32 kan niet worden gevonden FrameworkList.xml omdat deze niet bestaat
Onherstelbare fout: libhostfxr.so kan niet worden gevonden
Onherstelbare fout: map /host/fxr bestaat niet
Onherstelbare fout: map /host/fxr bevat geen onderliggende mappen met versienummers
Algemene fouten zonder duidelijke berichten
- Core #4605: kan geen nieuwedotnet console uitvoeren
- Core #4644: Kan .NET Core SDK 2.1 niet installeren op Fedora 32
- Runtime #49375: Na het bijwerken naar 5.0.200-1 met pakketbeheer, lijkt het erop dat er geen SDK's zijn geïnstalleerd
- Installatieprogramma #16438: De toepassing '--version' bestaat niet