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
  • 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

  • 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.

      1. 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*'
        
      2. 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
        
      3. Réinstallez .NET à partir du flux de package de la distribution. Pour plus d’informations, consultez Installer .NET sur Linux.

    • Non

      1. 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*'
        
      2. Supprimez le flux de dépôt Microsoft de votre distribution.

        sudo dnf remove packages-microsoft-prod
        
      3. 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.

      1. 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*'
        
      2. Si ce n’est déjà fait, créez /etc/apt/preferences.

        touch /etc/apt/preferences
        
      3. Ouvrez /etc/apt/preferences dans un éditeur et ajoutez les paramètres suivants afin que les packages qui commencent par dotnet, aspnetcore ou netstandard ne puissent pas être sourcés à partir du dépôt Microsoft :

        Package: dotnet* aspnet* netstandard*
        Pin: origin "packages.microsoft.com"
        Pin-Priority: -10
        
      4. Réinstallez .NET à partir du flux de package de la distribution. Pour plus d’informations, consultez Installer .NET sur Linux.

    • Non

      1. 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*'
        
      2. 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
        
      3. 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.

  1. 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*'
    
  2. 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.

  3. 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.

  1. 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*'
    
  2. Si ce n’est déjà fait, créez /etc/apt/preferences.

    touch /etc/apt/preferences
    
  3. Ouvrez /etc/apt/preferences dans un éditeur et ajoutez les paramètres suivants afin que les packages qui commencent par dotnet, aspnetcore ou netstandard ne puissent pas être sourcés à partir du dépôt 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 ; par exemple sur Ubuntu, vous pouvez utiliser archive.ubuntu.com aux États-Unis.

    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
    
  4. 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 :

Voir aussi