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?
Importante
A partire da .NET 9, Microsoft pubblica solo pacchetti per distribuzioni Linux supportate che non pubblicano i propri pacchetti. Per altre informazioni, vedere Installare .NET in Linux.
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.
- È necessaria una versione di .NET non fornita dalla 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?
Sì
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.
Rimuovere i pacchetti .NET esistenti dalla distribuzione. Si vuole ricominciare e assicurarsi di non installarli dal repository sbagliato.
sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
Configurare il repository Microsoft per ignorare i pacchetti .NET.
echo 'excludepkgs=dotnet*,aspnet*,netstandard*' | sudo tee -a /etc/yum.repos.d/microsoft-prod.repo
Reinstallare .NET dal feed del pacchetto della distribuzione. Per altre informazioni, vedere Installare .NET in Linux.
No
Rimuovere i pacchetti .NET esistenti dalla distribuzione. Si vuole ricominciare e assicurarsi di non installarli dal repository sbagliato.
sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
Eliminare il feed del repository Microsoft dalla distribuzione.
sudo dnf remove packages-microsoft-prod
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?
Sì
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.
Rimuovere i pacchetti .NET esistenti dalla distribuzione. Si vuole ricominciare e assicurarsi di non installarli dal repository sbagliato.
sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
Creare
/etc/apt/preferences
, se non esiste già.touch /etc/apt/preferences
Aprire
/etc/apt/preferences
in un editor e aggiungere le impostazioni seguenti, che impediscono ai pacchetti che iniziano condotnet
,aspnetcore
onetstandard
di essere originati dal repository Microsoft:Package: dotnet* aspnet* netstandard* Pin: origin "packages.microsoft.com" Pin-Priority: -10
Reinstallare .NET dal feed del pacchetto della distribuzione. Per altre informazioni, vedere Installare .NET in Linux.
No
Rimuovere i pacchetti .NET esistenti dalla distribuzione. Si vuole ricominciare e assicurarsi di non installarli dal repository sbagliato.
sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
Eliminare il feed del repository Microsoft dalla distribuzione.
sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list sudo apt update
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.
Rimuovere i pacchetti .NET esistenti dalla distribuzione. Si vuole ricominciare e assicurarsi di non installarli dal repository sbagliato.
sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
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.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.
Rimuovere i pacchetti .NET esistenti dalla distribuzione. Si vuole ricominciare e assicurarsi di non installarli dal repository sbagliato.
sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
Creare
/etc/apt/preferences
, se non esiste già.touch /etc/apt/preferences
Aprire
/etc/apt/preferences
in un editor e aggiungere un frammento di preferenze apt per impedire che i pacchetti che iniziano condotnet
,aspnetcore
onetstandard
vengano 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 persecurity.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
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:
System.IO.FileNotFoundException e '/usr/dotnetsharepacks/Microsoft.NETCore.App.Ref/5.0.0/data/FrameworkList.xml'
- SDK n. 15785: impossibile compilare un nuovo progetto dopo l'aggiornamento alla versione 5.0.3
- SDK n. 15863: "MSB4018 attività ResolveTargetingPackAssets non riuscita in modo imprevisto" dopo l'aggiornamento alla versione 5.0.103
- SDK n. 17411: dotnet compilazione che genera sempre un errore
- SDK n. 12075: dotnet 3.1.301 su Fedora 32 non è in grado di trovare FrameworkList.xml perché non esiste
Errore irreversibile: impossibile trovare libhostfxr.so
Errore irreversibile: la cartella /host/fxr non esiste
Errore irreversibile: la cartella /host/fxr non contiene cartelle figlio con numero di versione
- Programma di installazione n. 9254: errore durante l'installazione di dotnet /core/aspnet:3.1 in CentOS 8 - La cartella non contiene cartelle figlio con numero di versione
- StackOverflow: Errore durante l'installazione di dotnet/core/aspnet:3.1 in CentOS 8 - La cartella non contiene cartelle figlio con numero di versione
Errori generici senza messaggi chiari
- Core n. 4605: non è possibile eseguire "dotnet nuova console"
- Core n. 4644: non è possibile installare .NET Core SDK 2.1 in Fedora 32
- Runtime n. 49375: dopo l'aggiornamento alla versione 5.0.200-1 tramite gestione pacchetti, sembra che non sia installato alcun sdk
- Programma di installazione #16438: l'applicazione '--version' non esiste