Condividi tramite


Risolvere gli errori .NET correlati ai file mancanti in Linux

Quando si tenta di usare .NET in Linux, comandi come dotnet new e dotnet run potrebbero non funzionare con un messaggio relativo a un file non trovato, ad esempio fxr, libhostfxr.so o FrameworkList.xml . Alcuni messaggi di errore possono essere simili agli elementi seguenti:

  • System.IO.FileNotFoundException

    System.IO.FileNotFoundException: impossibile trovare il file '/usr/share/dotnetpacks/Microsoft.NETCore.App.Ref/5.0.0/data/FrameworkList.xml'.

  • Si è verificato un errore irreversibile.

    Si è verificato un errore irreversibile. Impossibile trovare la libreria libhostfxr.so richiesta.

    oppure

    Si è verificato un errore irreversibile. La cartella [/usr/dotnetshare/host/fxr] non esiste.

    oppure

    Si è verificato un errore irreversibile, la cartella [/usr/share/dotnethost/fxr] non contiene cartelle secondarie con numero di versione.

  • Messaggi generici su dotnet non trovato

    Potrebbe essere visualizzato un messaggio generale che indica che l'SDK non è stato trovato o che il pacchetto è già stato installato.

Un sintomo di questi problemi è la presenza nel sistema di entrambe le cartelle /usr/lib64/dotnet e /usr/share/dotnet.

Suggerimento

Usare il comando dotnet --info per elencare gli SDK e i runtime installati. Per altre informazioni, vedere Come verificare che .NET sia già installato.

Cosa è successo?

Questi errori si verificano in genere quando due repository di pacchetti Linux forniscono pacchetti .NET. Mentre Microsoft fornisce un repository di pacchetti Linux per l'origine dei pacchetti .NET, alcune distribuzioni Linux forniscono anche pacchetti .NET. Queste distribuzioni includono:

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

Se si combinano pacchetti .NET provenineti da due origini diverse, è probabile che si verifichino problemi. I pacchetti potrebbero collocare gli elementi in percorsi diversi e potrebbero essere compilati in modo diverso.

Soluzioni

La soluzione a questi problemi consiste nell'usare .NET da un repository di pacchetti. Quale repository scegliere e come farlo varia in base al caso d'uso e alla distribuzione Linux.

La distribuzione linux fornisce pacchetti .NET e si vuole usarli

  • Si usa il repository Microsoft per altri pacchetti, ad esempio PowerShell e MSSQL?

    • Configurare gestione pacchetti per ignorare i pacchetti .NET provenienti dal repository Microsoft. È possibile che .NET sia stato installato da entrambi i repository, quindi è consigliabile scegliere l'uno o l'altro.

      1. Rimuovere i pacchetti .NET esistenti dalla distribuzione. Si vuole ricominciare e assicurarsi di non installarli dal repository sbagliato.

        sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. Configurare il repository Microsoft per ignorare i pacchetti .NET.

        echo 'excludepkgs=dotnet*,aspnet*,netstandard*' | sudo tee -a /etc/yum.repos.d/microsoft-prod.repo
        
      3. Reinstallare .NET dal feed del pacchetto della distribuzione. Per altre informazioni, vedere Installare .NET in Linux.

    • No

      1. Rimuovere i pacchetti .NET esistenti dalla distribuzione. Si vuole ricominciare e assicurarsi di non installarli dal repository sbagliato.

        sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. Eliminare il feed del repository Microsoft dalla distribuzione.

        sudo dnf remove packages-microsoft-prod
        
      3. Reinstallare .NET dal feed del pacchetto della distribuzione. Per altre informazioni, vedere Installare .NET in Linux.

  • Si usa il repository Microsoft per altri pacchetti, ad esempio PowerShell e MSSQL?

    • Configurare gestione pacchetti per ignorare i pacchetti .NET provenienti dal repository Microsoft. È possibile che .NET sia stato installato da entrambi i repository, quindi è consigliabile scegliere l'uno o l'altro.

      1. Rimuovere i pacchetti .NET esistenti dalla distribuzione. Si vuole ricominciare e assicurarsi di non installarli dal repository sbagliato.

        sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. Creare /etc/apt/preferences, se non esiste già.

        touch /etc/apt/preferences
        
      3. Aprire /etc/apt/preferences in un editor e aggiungere le impostazioni seguenti, che impediscono ai pacchetti che iniziano con dotnet, aspnetcore o netstandard di essere originati dal repository Microsoft:

        Package: dotnet* aspnet* netstandard*
        Pin: origin "packages.microsoft.com"
        Pin-Priority: -10
        
      4. Reinstallare .NET dal feed del pacchetto della distribuzione. Per altre informazioni, vedere Installare .NET in Linux.

    • No

      1. Rimuovere i pacchetti .NET esistenti dalla distribuzione. Si vuole ricominciare e assicurarsi di non installarli dal repository sbagliato.

        sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. Eliminare il feed del repository Microsoft dalla distribuzione.

        sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list
        sudo apt update
        
      3. Reinstallare .NET dal feed del pacchetto della distribuzione. Per altre informazioni, vedere Installare .NET in Linux.

È necessaria una versione di .NET non fornita dalla distribuzione Linux

Configurare gestione pacchetti per ignorare i pacchetti .NET provenienti dal repository della distribuzione. È possibile che .NET sia stato installato da entrambi i repository, quindi è consigliabile scegliere l'uno o l'altro.

  1. Rimuovere i pacchetti .NET esistenti dalla distribuzione. Si vuole ricominciare e assicurarsi di non installarli dal repository sbagliato.

    sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
    
  2. Configurare il repository Linux per ignorare i pacchetti .NET.

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

    Assicurarsi di sostituire <your-package-source> con l'origine del pacchetto della distribuzione.

  3. Reinstallare .NET dal feed del pacchetto della distribuzione. Per altre informazioni, vedere Installare .NET in Linux.

Configurare gestione pacchetti per ignorare i pacchetti .NET provenienti dal repository della distribuzione. È possibile che .NET sia stato installato da entrambi i repository, quindi è consigliabile scegliere l'uno o l'altro.

  1. Rimuovere i pacchetti .NET esistenti dalla distribuzione. Si vuole ricominciare e assicurarsi di non installarli dal repository sbagliato.

    sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
    
  2. Creare /etc/apt/preferences, se non esiste già.

    touch /etc/apt/preferences
    
  3. Aprire /etc/apt/preferences in un editor e aggiungere una deframmentazione delle preferenze apt per impedire ai pacchetti che iniziano con dotnet, aspnetcore o netstandard di essere originati dal repository della distribuzione.

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

    Assicurarsi di sostituire <your-package-source> con l'origine del pacchetto della distribuzione.

    La distribuzione può avere più di un'origine pacchetto.

    Ad esempio, in Ubuntu negli Stati Uniti potrebbe essere necessario usare un frammento per archive.ubuntu.com e un altro per security.ubuntu.com. Separare ogni frammento con una riga vuota simile alla seguente:

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

    Suggerimento

    Usare il comando apt-cache policy per trovare l'origine:

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

    Suggerimento

    Se si è registrato il repository di pacchetti backport di Ubuntu .NET, è consigliabile annullare la registrazione del repository di pacchetti backport di Ubuntu .NET anziché configurare la gestione pacchetti, in modo che ignori i pacchetti .NET in esso contenuti. In caso contrario, gestione pacchetti esegue il pull dell'indice del pacchetto da questo repository, per poi ignorarlo, perché il repository contiene solo pacchetti .NET. In questo modo si rallenta l'aggiornamento dell'indice dei pacchetti locali ogni volta che si chiama apt update.

    Usare il comando apt-cache policy per verificare se è stato registrato il repository di pacchetti backport di Ubuntu .NET:

    apt-cache policy '?name(dotnet.*)' | grep 'ppa.launchpadcontent.net/dotnet/backports' | sort -u
    
  4. Reinstallare .NET dal feed del pacchetto Microsoft. Per altre informazioni, vedere Installare .NET in Linux. Se si usa Ubuntu, vedere La distribuzione di Ubuntu non include la versione di .NET desiderata, oppure è necessaria una versione di .NET non supportata.

Riferimenti online

Molti altri utenti hanno segnalato questi problemi. Di seguito è riportato un elenco di tali problemi. È possibile leggerli per ottenere informazioni dettagliate su ciò che potrebbe accadere:

Vedi anche