Resolver erros .NET relacionados com ficheiros em falta no Linux

Quando tenta utilizar o .NET no Linux, comandos como dotnet new e dotnet run podem falhar com uma mensagem relacionada com um ficheiro que não está a ser 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 localizar 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//dotnethost/fxr] não existe.

    ou

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

  • Mensagens genéricas sobre dotnet não encontradas

    Pode ser apresentada uma mensagem geral que indica que o SDK não foi encontrado ou que o pacote já foi instalado.

Um dos sintomas destes problemas é que as /usr/lib64/dotnet pastas e /usr/share/dotnet estão no seu sistema.

Dica

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

O que se passa?

Normalmente, estes erros ocorrem quando dois repositórios de pacotes linux fornecem pacotes .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, tais como:

  • Alpine Linux
  • Arco
  • CentOS
  • CentOS Stream
  • Fedora
  • RHEL
  • Ubuntu 22.04+

A combinação de pacotes .NET de duas origens diferentes irá provavelmente originar problemas, uma vez que os pacotes podem colocar as coisas em caminhos diferentes e podem ser compilados de forma diferente.

Soluções

A solução para estes problemas é utilizar o .NET a partir de um repositório de pacote. O repositório a escolher e como fazê-lo varia consolho de utilização e distribuição do Linux.

A minha distribuição do Linux fornece pacotes .NET e quero utilizá-los

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

    • Sim

      Configure o gestor 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. Quer recomeçar e garantir que não os instala 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. Quer recomeçar e garantir que não os instala a partir do repositório errado.

        sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. Elimine o feed de 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.

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

    • Sim

      Configure o gestor 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. Quer recomeçar e garantir que não os instala a partir do repositório errado.

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

        touch /etc/apt/preferences
        
      3. Abra /etc/apt/preferences num editor e adicione as seguintes definições, o que impede que os pacotes que começam com dotnet, aspnetcoreou netstandard sejam obtidos a partir 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. Quer recomeçar e garantir que não os instala a partir do repositório errado.

        sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. Elimine o feed de 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 do Linux

Configure o gestor 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. Quer recomeçar e garantir que não os instala a partir do repositório errado.

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

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

    Certifique-se de que substitui <your-package-source> pela origem do pacote de 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 o gestor 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. Quer recomeçar e garantir que não os instala a partir do repositório errado.

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

    touch /etc/apt/preferences
    
  3. Abra /etc/apt/preferences num editor e adicione as seguintes definições, o que impede que os pacotes que começam com dotnet, aspnetcoreou netstandard sejam obtidos a partir do repositório da distribuição.

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

    Certifique-se de que substitui <your-package-source> pela origem do pacote de distribuição, por exemplo, no Ubuntu que utilizaria archive.ubuntu.com.

  4. Reinstale o .NET a partir do feed de pacotes da Microsoft. Para obter mais informações, consulte Instalar o .NET no Linux. Se utilizar o Ubuntu, consulte A minha distribuição Ubuntu não inclui a versão .NET pretendida ou preciso de uma versão .NET sem suporte.

Referências online

Muitos outros utilizadores reportaram estes problemas. Segue-se uma lista desses problemas. Pode lê-las para obter informações sobre o que pode estar a acontecer:

Ver também