Solucionar erros do .NET relacionados a arquivos ausentes no Linux
Ao tentar usar o .NET no Linux, comandos como dotnet new
e dotnet run
podem falhar com uma mensagem relacionada a um arquivo não encontrado, como fxr, libhostfxr.so ou FrameworkList.xml. Algumas das mensagens de erro podem ser semelhantes aos seguintes itens:
System.IO.FileNotFoundException
System.IO.FileNotFoundException: não foi possível localizar o arquivo '/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/5.0.0/data/FrameworkList.xml'.
Ocorreu um erro fatal.
Ocorreu um erro fatal. Não foi possível encontrar a biblioteca necessária libhostfxr.so.
ou
Ocorreu um erro fatal. A pasta [/usr/share/dotnethost/fxr] não existe.
ou
Ocorreu um erro fatal, a pasta [//usrshare/dotnethost/fxr] não contém pastas filho com o número da versão.
Mensagens genéricas sobre dotnet não encontradas
Uma mensagem geral pode ser exibida indicando que o SDK não foi encontrado ou que o pacote já foi instalado.
Um sintoma desses problemas é que as pastas /usr/lib64/dotnet
e /usr/share/dotnet
estão no sistema.
Dica
Use o comando dotnet --info
para listar quais SDKs e runtimes estão instalados. Para obter mais informações, confira Como verificar se o .NET já está instalado.
O que está acontecendo
Importante
A partir do .NET 9, a Microsoft publica apenas pacotes para distribuições Linux com suporte que não publicam seus próprios pacotes. Para saber mais, confira Instalar o .NET no Linux.
Esses erros geralmente ocorrem quando dois repositórios de pacotes do Linux fornecem pacotes do .NET. Embora a Microsoft forneça um repositório de pacotes Linux para pacotes .NET de origem, algumas distribuições do Linux também fornecem pacotes .NET. Essas distribuições incluem:
- Alpine Linux
- Arch
- CentOS Stream
- Fedora
- RHEL
- Ubuntu 22.04+
Se você misturar pacotes .NET de duas fontes diferentes, provavelmente terá problemas. Os pacotes podem colocar as coisas em caminhos diferentes e podem ser compilados de modo diferente.
Soluções
A solução para esses problemas é usar o .NET em um repositório de pacotes. Qual repositório escolher e como fazer isso varia de acordo com o caso de uso e a distribuição do Linux.
- Minha distribuição do Linux fornece pacotes do .NET e desejo usá-los.
- Preciso de uma versão do .NET que não é fornecida pela minha distribuição do Linux.
Minha distribuição do Linux fornece pacotes do .NET e desejo usá-los
Você usa o repositório da Microsoft para outros pacotes, como o PowerShell e o MSSQL?
Sim
Configure o gerenciador de pacotes para ignorar os pacotes do .NET no repositório da Microsoft. É possível que você tenha instalado o .NET por meio dos dois repositórios, portanto, escolha um ou outro.
Remova os pacotes existentes do .NET de sua distribuição. Recomece e não os instale por meio do repositório errado.
sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
Configure o repositório da Microsoft para ignorar os pacotes do .NET.
echo 'excludepkgs=dotnet*,aspnet*,netstandard*' | sudo tee -a /etc/yum.repos.d/microsoft-prod.repo
Reinstale o .NET por meio do feed de pacotes da distribuição. Para saber mais, confira Instalar o .NET no Linux.
Não
Remova os pacotes existentes do .NET de sua distribuição. Recomece e não os instale por meio do repositório errado.
sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
Exclua o feed do repositório da Microsoft de sua distribuição.
sudo dnf remove packages-microsoft-prod
Reinstale o .NET por meio do feed de pacotes da distribuição. Para saber mais, confira Instalar o .NET no Linux.
Você usa o repositório da Microsoft para outros pacotes, como o PowerShell e o MSSQL?
Sim
Configure o gerenciador de pacotes para ignorar os pacotes do .NET no repositório da Microsoft. É possível que você tenha instalado o .NET por meio dos dois repositórios, portanto, escolha um ou outro.
Remova os pacotes existentes do .NET de sua distribuição. Recomece e não os instale por meio do repositório errado.
sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
Crie o
/etc/apt/preferences
, se ele ainda não existir.touch /etc/apt/preferences
Abra
/etc/apt/preferences
em um editor e adicione as seguintes configurações, que impedem que os pacotes que começam comdotnet
,aspnetcore
ounetstandard
sejam obtidos no repositório da Microsoft:Package: dotnet* aspnet* netstandard* Pin: origin "packages.microsoft.com" Pin-Priority: -10
Reinstale o .NET por meio do feed de pacotes da distribuição. Para saber mais, confira Instalar o .NET no Linux.
Não
Remova os pacotes existentes do .NET de sua distribuição. Recomece e não os instale por meio do repositório errado.
sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
Exclua o feed do repositório da Microsoft de sua distribuição.
sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list sudo apt update
Reinstale o .NET por meio do feed de pacotes da distribuição. Para saber mais, confira Instalar o .NET no Linux.
Preciso de uma versão do .NET que não é fornecida pela minha distribuição Linux
Configure o gerenciador de pacotes para ignorar os pacotes do .NET no repositório da distribuição. É possível que você tenha instalado o .NET por meio dos dois repositórios, portanto, escolha um ou outro.
Remova os pacotes existentes do .NET de sua distribuição. Recomece e não os instale por meio do repositório errado.
sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
Configure o repositório do Linux para ignorar os pacotes do .NET.
echo 'excludepkgs=dotnet*,aspnet*,netstandard*' | sudo tee -a /etc/yum.repos.d/<your-package-source>.repo
Substitua
<your-package-source>
pela fonte do pacote da sua distribuição.Reinstale o .NET por meio do feed de pacotes da distribuição. Para saber mais, confira Instalar o .NET no Linux.
Configure o gerenciador de pacotes para ignorar os pacotes do .NET no repositório da distribuição. É possível que você tenha instalado o .NET por meio dos dois repositórios, portanto, escolha um ou outro.
Remova os pacotes existentes do .NET de sua distribuição. Recomece e não os instale por meio do repositório errado.
sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
Crie o
/etc/apt/preferences
, se ele ainda não existir.touch /etc/apt/preferences
Abra
/etc/apt/preferences
em um editor e adicione um fragmento de preferências do apt para evitar que pacotes que começam comdotnet
,aspnetcore
ounetstandard
sejam originados do repositório da distribuição.Package: dotnet* aspnet* netstandard* Pin: origin "<your-package-source>" Pin-Priority: -10
Substitua
<your-package-source>
pela fonte do pacote da sua distribuição.Sua distribuição pode ter mais de uma fonte de pacote.
Por exemplo, no Ubuntu nos EUA, talvez seja necessário usar um fragmento para
archive.ubuntu.com
e outro parasecurity.ubuntu.com
. Separe cada fragmento com uma linha em branco como esta:Package: dotnet* aspnet* netstandard* Pin: origin "archive.ubuntu.com" Pin-Priority: -10 Package: dotnet* aspnet* netstandard* Pin: origin "security.ubuntu.com" Pin-Priority: -10
Dica
Use o comando
apt-cache policy
para localizar a origem:apt-cache policy '?name(dotnet.*)' | grep -v microsoft | grep '/ubuntu' | cut -d"/" -f3 | sort -u
Dica
Se você registrou o repositório de pacotes backports do Ubuntu .NET você deve cancelar o registro do repositório de pacotes backports do Ubuntu .NET em vez de configurar seu gerenciador de pacotes para ignorar os pacotes .NET contidos. Caso contrário, seu gerenciador de pacotes extrai o índice do pacote deste repositório, apenas para ignorá-lo, porque o repositório contém apenas pacotes .NET. Isso efetivamente retarda a atualização do seu índice de pacotes local toda vez que você liga
apt update
.Use o comando
apt-cache policy
para verificar se você registrou o repositório de pacotes backports do Ubuntu .NET:apt-cache policy '?name(dotnet.*)' | grep 'ppa.launchpadcontent.net/dotnet/backports' | sort -u
Reinstale o .NET por meio do feed de pacotes da Microsoft. Para saber mais, confira Instalar o .NET no Linux. Ao usar o Ubuntu, confira Minha distribuição do Ubuntu não inclui a versão desejada do .NET ou preciso de uma versão dele que não tem mais suporte.
Referências online
Muitos outros usuários relataram esses problemas. A lista a seguir é desses problemas. Você pode ler esses problemas para obter insights sobre o que pode estar acontecendo:
System.IO.FileNotFoundException e '/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/5.0.0/data/FrameworkList.xml'
- SDK nº 15785: não é possível criar um novo projeto depois de atualizar para 5.0.3
- SDK nº 15863: "a tarefa ResolveTargetingPackAssets do MSB4018 falhou inesperadamente" depois de atualizar para 5.0.103
- SDK nº 17411: a compilação dotnet sempre gera erro
- SDK nº 12075: dotnet 3.1.301 no Fedora 32, não é possível localizar FrameworkList.xml porque ele não existe
Erro fatal: não foi possível encontrar libhostfxr.so
Erro fatal: a pasta /host/fxr não existe
Erro fatal: a pasta /host/fxr não contém as pastas filho com o número da versão
Erros genéricos sem mensagens claras
- Core nº 4605: não é possível executar o "novo console do dotnet"
- Core nº 4644: não é possível instalar o SDK 2.1 do .NET Core no Fedora 32
- Runtime nº 49375: depois de atualizar para 5.0.200-1 usando o gerenciador de pacotes, parece que nenhum SDK foi instalado
- Instalador nº 16438: o aplicativo "--version" não existe