Résoudre les erreurs .NET liées à des fichiers manquants sous Linux
Lorsque vous essayez d’utiliser .NET sous Linux, les commandes telles que dotnet new
et dotnet run
peuvent échouer avec un message lié à un fichier introuvable, tel que fxr, libhostfxr.so ou FrameworkList.xml. Vous pouvez par exemple recevoir des messages d’erreur semblables aux suivants :
System.IO.FileNotFoundException
System.IO.FileNotFoundException : Le fichier « /usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/5.0.0/data/FrameworkList.xml » est introuvable.
Une erreur irrécupérable s’est produite.
Une erreur irrécupérable s'est produite. La bibliothèque requise libhostfxr.so est introuvable.
ou
Une erreur irrécupérable s'est produite. Le dossier [/usr/share/dotnet/host/fxr] n’existe pas.
ou
Une erreur irrécupérable s’est produite, le dossier [/usrshare/dotnethost/fxr] ne contient aucun dossier enfant avec numéro de version.
Messages génériques sur dotnet introuvables
Un message général peut s’afficher et indiquer que le kit de développement logiciel (SDK) est introuvable ou que le package a déjà été installé.
La présence des dossiers /usr/lib64/dotnet
et /usr/share/dotnet
sur votre système est un symptôme de ces problèmes.
Conseil
Utilisez la commande dotnet --info
pour lister les SDK et les runtimes installés. Pour plus d’informations, consultez Comment vérifier que .NET est déjà installé.
Que se passe-t-il ?
Ces erreurs se produisent généralement quand deux dépôts de packages Linux fournissent des packages .NET. Bien que Microsoft fournisse un référentiel de packages Linux pour approvisionner les packages .NET, certaines distributions Linux fournissent également des packages .NET. Ces distributions comprennent :
- Alpine Linux
- Arch
- CentOS Stream
- Fedora
- RHEL
- Ubuntu 22.04+
Si vous combinez des packages .NET de deux sources différentes, vous rencontrerez probablement des problèmes. Les packages peuvent placer des éléments sur des chemins d’accès différents et être compilés différemment.
Solutions
La solution à ces problèmes consiste à utiliser .NET à partir d’un seul référentiel de packages. Le choix du référentiel et la façon de le faire varient en fonction du cas d’usage et de la distribution Linux.
- Ma distribution Linux fournit des packages .NET et je souhaite les utiliser.
- J’ai besoin d’une version de .NET qui n’est pas fournie par ma distribution Linux.
Ma distribution Linux fournit des packages .NET et je souhaite les utiliser
Utilisez-vous le dépôt Microsoft pour d’autres packages, tels que PowerShell et MSSQL ?
Oui
Configurez votre gestionnaire de packages de manière à ignorer les packages .NET à partir du dépôt Microsoft. Il est possible que vous ayez installé .NET à partir des deux dépôts. Vous devez donc choisir l’un ou l’autre.
Supprimez les packages .NET existants de votre distribution. Vous devez recommencer en veillant à ne pas les installer à partir du dépôt incorrect.
sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
Configurez le dépôt Microsoft de manière à ignorer les packages .NET.
echo 'excludepkgs=dotnet*,aspnet*,netstandard*' | sudo tee -a /etc/yum.repos.d/microsoft-prod.repo
Réinstallez .NET à partir du flux de package de la distribution. Pour plus d’informations, consultez Installer .NET sur Linux.
Non
Supprimez les packages .NET existants de votre distribution. Vous devez recommencer en veillant à ne pas les installer à partir du dépôt incorrect.
sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
Supprimez le flux de dépôt Microsoft de votre distribution.
sudo dnf remove packages-microsoft-prod
Réinstallez .NET à partir du flux de package de la distribution. Pour plus d’informations, consultez Installer .NET sur Linux.
Utilisez-vous le dépôt Microsoft pour d’autres packages, tels que PowerShell et MSSQL ?
Oui
Configurez votre gestionnaire de packages de manière à ignorer les packages .NET à partir du dépôt Microsoft. Il est possible que vous ayez installé .NET à partir des deux dépôts. Vous devez donc choisir l’un ou l’autre.
Supprimez les packages .NET existants de votre distribution. Vous devez recommencer en veillant à ne pas les installer à partir du dépôt incorrect.
sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
Si ce n’est déjà fait, créez
/etc/apt/preferences
.touch /etc/apt/preferences
Ouvrez
/etc/apt/preferences
dans un éditeur et ajoutez les paramètres suivants afin que les packages qui commencent pardotnet
,aspnetcore
ounetstandard
ne puissent pas être sourcés à partir du dépôt Microsoft :Package: dotnet* aspnet* netstandard* Pin: origin "packages.microsoft.com" Pin-Priority: -10
Réinstallez .NET à partir du flux de package de la distribution. Pour plus d’informations, consultez Installer .NET sur Linux.
Non
Supprimez les packages .NET existants de votre distribution. Vous devez recommencer en veillant à ne pas les installer à partir du dépôt incorrect.
sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
Supprimez le flux de dépôt Microsoft de votre distribution.
sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list sudo apt update
Réinstallez .NET à partir du flux de package de la distribution. Pour plus d’informations, consultez Installer .NET sur Linux.
J’ai besoin d’une version de .NET qui n’est pas fournie par ma distribution Linux
Configurez votre gestionnaire de packages de manière à ignorer les packages .NET à partir du dépôt de la distribution. Il est possible que vous ayez installé .NET à partir des deux dépôts. Vous devez donc choisir l’un ou l’autre.
Supprimez les packages .NET existants de votre distribution. Vous devez recommencer en veillant à ne pas les installer à partir du dépôt incorrect.
sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
Configurez le dépôt Linux de manière à ignorer les packages .NET.
echo 'excludepkgs=dotnet*,aspnet*,netstandard*' | sudo tee -a /etc/yum.repos.d/<your-package-source>.repo
Veillez à remplacer
<your-package-source>
par la source de package de votre distribution.Réinstallez .NET à partir du flux de package de la distribution. Pour plus d’informations, consultez Installer .NET sur Linux.
Configurez votre gestionnaire de packages de manière à ignorer les packages .NET à partir du dépôt de la distribution. Il est possible que vous ayez installé .NET à partir des deux dépôts. Vous devez donc choisir l’un ou l’autre.
Supprimez les packages .NET existants de votre distribution. Vous devez recommencer en veillant à ne pas les installer à partir du dépôt incorrect.
sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
Si ce n’est déjà fait, créez
/etc/apt/preferences
.touch /etc/apt/preferences
Ouvrez
/etc/apt/preferences
dans un éditeur et ajoutez un fragment des préférences apt afin que les packages qui commencent pardotnet
,aspnetcore
ounetstandard
ne puissent pas être sourcés à partir du référentiel de la distribution.Package: dotnet* aspnet* netstandard* Pin: origin "<your-package-source>" Pin-Priority: -10
Veillez à remplacer
<your-package-source>
par la source de package de votre distribution.Votre distribution peut avoir plus d’une source de package.
Par exemple, sur Ubuntu aux États-Unis, vous pouvez utiliser un fragment pour
archive.ubuntu.com
et un autre poursecurity.ubuntu.com
. Séparez chaque fragment par une ligne vide de la manière suivante :Package: dotnet* aspnet* netstandard* Pin: origin "archive.ubuntu.com" Pin-Priority: -10 Package: dotnet* aspnet* netstandard* Pin: origin "security.ubuntu.com" Pin-Priority: -10
Conseil
Utilisez la commande
apt-cache policy
pour rechercher la source :apt-cache policy '?name(dotnet.*)' | grep -v microsoft | grep '/ubuntu' | cut -d"/" -f3 | sort -u
Conseil
Si vous avez inscrit le référentiel de packages de rétroports .NET d’Ubuntu, vous devez Annuler l’inscription du dépôt des packages de rétroports .NET d’Ubuntu au lieu de configurer votre gestionnaire de package pour ignorer les packages .NET contenus. Sinon, votre gestionnaire de package extrait l’index du package depuis ce référentiel, juste pour l’ignorer, car le référentiel contient uniquement des packages .NET. Cela ralentit considérablement la mise à jour de votre index de package local à chaque appel de
apt update
.Utilisez la commande
apt-cache policy
pour vérifier si vous avez inscrit le référentiel du package de rétroports Ubuntu .NET :apt-cache policy '?name(dotnet.*)' | grep 'ppa.launchpadcontent.net/dotnet/backports' | sort -u
Réinstallez .NET à partir du flux de package Microsoft. Pour plus d’informations, consultez Installer .NET sur Linux. Si vous utilisez Ubuntu, consultez Ma distribution Ubuntu n’inclut pas la version .NET souhaitée, ou j’ai besoin d’une version .NET sans prise en charge.
Références en ligne
De nombreux autres utilisateurs ont signalé ces problèmes. Voici une liste de ces problèmes. N’hésitez pas à les consulter pour en savoir plus sur ce qui peut se passer :
System.IO.FileNotFoundException et « /usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/5.0.0/data/FrameworkList.xml »
- SDK n°15785 : Impossible de générer un nouveau projet après la mise à niveau vers la version 5.0.3
- SDK n°15863 : « Échec inattendu de la tâche MSB4018 ResolveTargetingPackAssets » après la mise à jour vers la version 5.0.103
- SDK n°17411 : La build dotnet génère systématiquement une erreur
- SDK n°12075 : dotnet 3.1.301 sur Fedora 32 ne trouve pas FrameworkList.xml car il n’existe pas
Erreur irrécupérable : libhostfxr.so introuvable
Erreur irrécupérable : Le dossier /host/fxr n’existe pas
Erreur irrécupérable : Le dossier /host/fxr ne contient aucun dossier enfant avec numéro de version
- Programme d’installation n°9254 : Erreur lors de l’installation dotnet/core/aspnet:3.1 sous CentOS 8 - Le dossier ne contient aucun dossier enfant avec numéro de version
- StackOverflow : Erreur lors de l’installation dotnet/core/aspnet:3.1 sous CentOS 8 - Le dossier ne contient aucun dossier enfant avec numéro de version
Erreurs génériques sans message clair
- Core n°4605 : Impossible d’exécuter la « Nouvelle console dotnet »
- Core n°4644 : Impossible d’installer le kit SDK .NET Core 2.1 sur Fedora 32
- Runtime n°49375 : Après la mise à jour vers la version 5.0.200-1 à l’aide du gestionnaire de package, il apparaît qu’aucun SDK n’est installé
- Programme d’installation #16438 : l’application « --version » n’existe pas