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 um fragmento de preferências apt para impedir que os pacotes que começam com dotnet, aspnetcore ou netstandard 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 para security.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
    
  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