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

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

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

      1. 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*'
        
      2. 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
        
      3. Reinstale o .NET por meio do feed de pacotes da distribuição. Para saber mais, confira Instalar o .NET no Linux.

    • Não

      1. 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*'
        
      2. Exclua o feed do repositório da Microsoft de sua distribuição.

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

      1. 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*'
        
      2. Crie o /etc/apt/preferences, se ele ainda não existir.

        touch /etc/apt/preferences
        
      3. Abra /etc/apt/preferences em um editor e adicione as seguintes configurações, que impedem que os pacotes que começam com dotnet, aspnetcore ou netstandard sejam obtidos no repositório da Microsoft:

        Package: dotnet* aspnet* netstandard*
        Pin: origin "packages.microsoft.com"
        Pin-Priority: -10
        
      4. Reinstale o .NET por meio do feed de pacotes da distribuição. Para saber mais, confira Instalar o .NET no Linux.

    • Não

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

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

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

  1. 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*'
    
  2. Crie o /etc/apt/preferences, se ele ainda não existir.

    touch /etc/apt/preferences
    
  3. Abra /etc/apt/preferences em um editor e adicione as configurações a seguir, que impedem que os pacotes que começam com dotnet, aspnetcore ou netstandard sejam obtidos no 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, por exemplo, no Ubuntu você pode usar archive.ubuntu.com nos EUA.

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

Confira também