Solucionar erros do .NET relacionados a arquivos ausentes no Linux

Quando você tenta 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.soou FrameworkList.xml. Algumas das mensagens de erro podem ser semelhantes aos seguintes itens:

  • System.IO.FileNotFoundException

    System.IO.FileNotFoundException: Não foi possível encontrar o ficheiro '/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 libhostfxr.so necessária.

    ou

    Ocorreu um erro fatal. A pasta [/usr/share/dotnet/host/fxr] não existe.

    ou

    Ocorreu um erro fatal, a pasta [/usr/share/dotnet/host/fxr] não contém nenhuma pasta filha numerada por versão.

  • Mensagens genéricas sobre dotnet não encontrado

    Pode aparecer uma mensagem geral 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 seu sistema.

Gorjeta

Use o dotnet --info comando para listar quais SDKs e Runtimes estão instalados. Para obter mais informações, consulte Como verificar se o .NET já está instalado.

O que é que se passa

Importante

A partir do .NET 9 (atualmente em visualização), a Microsoft publica apenas pacotes para distribuições Linux suportadas que não publicam seus próprios pacotes. Para obter mais informações, consulte Instalar o .NET no Linux.

Esses erros geralmente ocorrem quando dois repositórios de pacotes Linux fornecem pacotes .NET. Enquanto a Microsoft fornece um repositório de pacotes Linux para pacotes .NET de origem, algumas distribuições Linux também fornecem pacotes .NET. Essas distribuições incluem:

  • Linux alpino
  • Arco
  • Fluxo do CentOS
  • 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 forma diferente.

Soluções

A solução para esses problemas é usar o .NET de um repositório de pacotes. Qual repositório escolher, e como fazê-lo, varia de acordo com o caso de uso e a distribuição Linux.

Minha distribuição Linux fornece pacotes .NET e eu quero usá-los

  • Você usa o repositório da Microsoft para outros pacotes, como PowerShell e MSSQL?

    • Sim

      Configure seu gerenciador de pacotes para ignorar os pacotes .NET do repositório da Microsoft. É possível que tenha instalado o .NET a partir de ambos os repositórios, pelo que pretende escolher um ou outro.

      1. Remova os pacotes .NET existentes da sua distribuição. Você quer começar de novo e garantir que não os instale a partir do repositório errado.

        sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. Configure o repositório da Microsoft para ignorar pacotes .NET.

        echo 'excludepkgs=dotnet*,aspnet*,netstandard*' | sudo tee -a /etc/yum.repos.d/microsoft-prod.repo
        
      3. Reinstale o .NET a partir do feed de pacotes da distribuição. Para obter mais informações, consulte Instalar o .NET no Linux.

    • Não

      1. Remova os pacotes .NET existentes da sua distribuição. Você quer começar de novo e garantir que não os instale a partir do repositório errado.

        sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. Exclua o feed do repositório da Microsoft da sua distribuição.

        sudo dnf remove packages-microsoft-prod
        
      3. Reinstale o .NET a partir do feed de pacotes da distribuição. Para obter mais informações, consulte Instalar o .NET no Linux.

  • Você usa o repositório da Microsoft para outros pacotes, como PowerShell e MSSQL?

    • Sim

      Configure seu gerenciador de pacotes para ignorar os pacotes .NET do repositório da Microsoft. É possível que tenha instalado o .NET a partir de ambos os repositórios, pelo que pretende escolher um ou outro.

      1. Remova os pacotes .NET existentes da sua distribuição. Você quer começar de novo e garantir que não os instale a partir do repositório errado.

        sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. Crie /etc/apt/preferenceso , se ainda não existir.

        touch /etc/apt/preferences
        
      3. Abra /etc/apt/preferences em um editor e adicione as seguintes configurações, o que impede que pacotes que comecem com dotnet, aspnetcoreou netstandard sejam originados do repositório da Microsoft:

        Package: dotnet* aspnet* netstandard*
        Pin: origin "packages.microsoft.com"
        Pin-Priority: -10
        
      4. Reinstale o .NET a partir do feed de pacotes da distribuição. Para obter mais informações, consulte Instalar o .NET no Linux.

    • Não

      1. Remova os pacotes .NET existentes da sua distribuição. Você quer começar de novo e garantir que não os instale a partir do repositório errado.

        sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. Exclua o feed do repositório da Microsoft da sua distribuição.

        sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list
        sudo apt update
        
      3. Reinstale o .NET a partir do feed de pacotes da distribuição. Para obter mais informações, consulte Instalar o .NET no Linux.

Preciso de uma versão do .NET que não seja fornecida pela minha distribuição Linux

Configure seu gerenciador de pacotes para ignorar os pacotes .NET do repositório da distribuição. É possível que tenha instalado o .NET a partir de ambos os repositórios, pelo que pretende escolher um ou outro.

  1. Remova os pacotes .NET existentes da sua distribuição. Você quer começar de novo e garantir que não os instale a partir do repositório errado.

    sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
    
  2. Configure o repositório Linux para ignorar pacotes .NET.

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

    Certifique-se de substituir <your-package-source> pela fonte do pacote da sua distribuição.

  3. Reinstale o .NET a partir do feed de pacotes da distribuição. Para obter mais informações, consulte Instalar o .NET no Linux.

Configure seu gerenciador de pacotes para ignorar os pacotes .NET do repositório da distribuição. É possível que tenha instalado o .NET a partir de ambos os repositórios, pelo que pretende escolher um ou outro.

  1. Remova os pacotes .NET existentes da sua distribuição. Você quer começar de novo e garantir que não os instale a partir do repositório errado.

    sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
    
  2. Crie /etc/apt/preferenceso , se ainda não existir.

    touch /etc/apt/preferences
    
  3. Abra /etc/apt/preferences em um editor e adicione um fragement de preferências apt para evitar que pacotes que comecem com dotnet, aspnetcoreou netstandard sejam originados do repositório da distribuição.

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

    Certifique-se de substituir <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, você pode precisar 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
    

    Gorjeta

    Use o apt-cache policy comando para localizar a fonte:

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

    Gorjeta

    Se você registrou o repositório de pacotes de backports do Ubuntu .NET, você deve cancelar o registro do repositório de pacotes de 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 de pacotes desse repositório, apenas para ignorá-lo, porque o repositório contém apenas pacotes .NET. Isso efetivamente retarda a atualização do índice do pacote local toda vez que você liga apt update.

    Use o apt-cache policy comando para verificar se você registrou o repositório de pacotes de backports do Ubuntu .NET:

    apt-cache policy '?name(dotnet.*)' | grep 'ppa.launchpadcontent.net/dotnet/backports' | sort -u
    
  4. Reinstale o .NET a partir do feed de pacotes da Microsoft. Para obter mais informações, consulte Instalar o .NET no Linux. Se estiver usando o Ubuntu, consulte Minha distribuição do Ubuntu não inclui a versão .NET que eu quero, ou eu preciso de uma versão .NET fora de suporte.

Referências online

Muitos outros utilizadores relataram esses problemas. Segue-se uma lista dessas questões. Você pode lê-los para obter informações sobre o que pode estar acontecendo:

Consulte também