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
- Båge
- 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.
- Jag behöver en version av .NET som inte tillhandahålls av min 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.
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*'
Konfigurera Microsoft-lagringsplatsen för att ignorera .NET-paket.
echo 'excludepkgs=dotnet*,aspnet*,netstandard*' | sudo tee -a /etc/yum.repos.d/microsoft-prod.repo
Installera om .NET från distributionens paketflöde. Mer information finns i Installera .NET på Linux.
Nej
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*'
Ta bort Microsoft-lagringsplatsens feed från din distribution.
sudo dnf remove packages-microsoft-prod
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.
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*'
Skapa
/etc/apt/preferences
, om det inte redan finns.touch /etc/apt/preferences
Öppna
/etc/apt/preferences
i ett redigeringsprogram och lägg till följande inställningar, vilket förhindrar att paket som börjar meddotnet
,aspnetcore
ellernetstandard
hämtas från Microsoft-lagringsplatsen:Package: dotnet* aspnet* netstandard* Pin: origin "packages.microsoft.com" Pin-Priority: -10
Installera om .NET från distributionens paketflöde. Mer information finns i Installera .NET på Linux.
Nej
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*'
Ta bort Microsoft-lagringsplatsens feed från din distribution.
sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list sudo apt update
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.
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*'
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.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.
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*'
Skapa
/etc/apt/preferences
, om det inte redan finns.touch /etc/apt/preferences
Öppna
/etc/apt/preferences
i en redigerare och lägg till en fragement för apt-inställningar för att förhindra att paket som börjar meddotnet
,aspnetcore
ellernetstandard
hämtas från distributionens lagringsplats.Package: dotnet* aspnet* netstandard* Pin: origin "<your-package-source>" Pin-Priority: -10
Ersätt
<your-package-source>
med distributionens paketkälla.Distributionen kan ha mer än en paketkälla.
På Ubuntu i USA kan du till exempel behöva använda ett fragment för
archive.ubuntu.com
och ett annat försecurity.ubuntu.com
. Avgränsa varje fragment med en tom rad så här:Package: dotnet* aspnet* netstandard* Pin: origin "archive.ubuntu.com" Pin-Priority: -10 Package: dotnet* aspnet* netstandard* Pin: origin "security.ubuntu.com" Pin-Priority: -10
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
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:
System.IO.FileNotFoundException och "/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/5.0.0/data/FrameworkList.xml"
- SDK #15785: Det går inte att skapa ett helt nytt projekt efter uppgraderingen till 5.0.3
- SDK #15863: "MSB4018 ResolveTargetingPackAssets-uppgift misslyckades oväntat" efter uppdatering till 5.0.103
- SDK #17411: dotnet kompilering genererar alltid fel
- SDK #12075: dotnet 3.1.301 på Fedora 32 kan inte hitta FrameworkList.xml eftersom den inte finns
Allvarligt fel: libhostfxr.so det gick inte att hitta
Allvarligt fel: mappen /host/fxr finns inte
Allvarligt fel: mappen /värden/fxr innehåller inga underordnade mappar med versionsnummer
Allmänna fel utan tydliga meddelanden
- Core #4605: kan inte köra "dotnet ny konsol"
- Core #4644: Det går inte att installera .NET Core SDK 2.1 på Fedora 32
- Runtime #49375: När du har uppdaterat till 5.0.200-1 med pakethanteraren verkar det som om inga sdk:er har installerats
- Installationsprogrammet #16438: Programmet "--version" finns inte