Solución de errores de .NET relacionados con archivos que faltan en Linux

Al intentar usar .NET en Linux, es posible que en comandos como dotnet new y dotnet run se produzca un error con un mensaje relacionado con un archivo que no se encuentra, tal como fxr, libhostfxr.so, o FrameworkList.xml. Algunos de los mensajes de error pueden ser similares a los elementos siguientes:

  • System.IO.FileNotFoundException

    System.IO.FileNotFoundException: No se encontró el archivo "/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/5.0.0/data/FrameworkList.xml".

  • Error grave

    Error grave. No se pudo encontrar la biblioteca libhostfxr.so especificada.

    or

    Error grave. La carpeta [/usr/share/dotnet/host/fxr] no existe.

    o

    Error irrecuperable. La carpeta [/usr/share/dotnet/host/fxr] no contiene ninguna carpeta secundaria con número de versión.

  • Mensajes genéricos que indican que no se encuentra dotnet

    Puede aparecer un mensaje general que indica que no se encuentra el SDK o que el paquete ya se ha instalado.

Un síntoma de estos problemas es que las carpetas /usr/lib64/dotnet y /usr/share/dotnet y están en el sistema.

Sugerencia

Use el comando dotnet --info para enumerar los SDK y los runtimes que están instalados. Para obtener más información, vea Cómo comprobar que .NET Core ya está instalado.

¿Qué sucede?

Importante

A partir de .NET 9, Microsoft solo publica paquetes para distribuciones de Linux compatibles que no publican sus propios paquetes. Para obtener más información, vea Instalación de .NET en Linux.

Estos errores suelen producirse cuando dos repositorios de paquetes de Linux proporcionan paquetes .NET. Mientras que Microsoft proporciona un repositorio de paquetes de Linux para los paquetes de .NET de origen, algunas distribuciones de Linux también proporcionan paquetes de .NET. Estas distribuciones incluyen:

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

Si combina paquetes de .NET de dos orígenes diferentes, es probable que se produzcan problemas. Los paquetes pueden colocar cosas en diferentes rutas de acceso y se pueden compilar de forma diferente.

Soluciones

Para solucionar estos problemas, hay que usar .NET desde un repositorio de paquetes. El repositorio que se elegirá y cómo se hará varía en función del caso de uso y la distribución de Linux.

Mi distribución de Linux proporciona paquetes .NET y quiero usarlos

  • ¿Usa el repositorio de Microsoft para otros paquetes, como PowerShell y MSSQL?

    • Configure el administrador de paquetes para omitir los paquetes .NET del repositorio de Microsoft. Es posible que haya instalado .NET desde ambos repositorios, de modo que quiere elegir uno o el otro.

      1. Quite los paquetes .NET existentes de la distribución. Quiere empezar de nuevo y asegurarse de que no los instala desde el repositorio incorrecto.

        sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. Configure el repositorio de Microsoft para omitir los paquetes .NET.

        echo 'excludepkgs=dotnet*,aspnet*,netstandard*' | sudo tee -a /etc/yum.repos.d/microsoft-prod.repo
        
      3. Vuelva a instalar .NET desde la fuente de paquetes de la distribución. Para obtener más información, vea Instalación de .NET en Linux.

    • No

      1. Quite los paquetes .NET existentes de la distribución. Quiere empezar de nuevo y asegurarse de que no los instala desde el repositorio incorrecto.

        sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. Elimine la fuente del repositorio de Microsoft de la distribución.

        sudo dnf remove packages-microsoft-prod
        
      3. Vuelva a instalar .NET desde la fuente de paquetes de la distribución. Para obtener más información, vea Instalación de .NET en Linux.

  • ¿Usa el repositorio de Microsoft para otros paquetes, como PowerShell y MSSQL?

    • Configure el administrador de paquetes para omitir los paquetes .NET del repositorio de Microsoft. Es posible que haya instalado .NET desde ambos repositorios, de modo que quiere elegir uno o el otro.

      1. Quite los paquetes .NET existentes de la distribución. Quiere empezar de nuevo y asegurarse de que no los instala desde el repositorio incorrecto.

        sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. Cree /etc/apt/preferences si no aún no existe.

        touch /etc/apt/preferences
        
      3. Abra /etc/apt/preferences en un editor y agregue la configuración siguiente. Esto impedirá que los paquetes que empiecen por dotnet, aspnetcore o netstandard se originen desde el repositorio de Microsoft:

        Package: dotnet* aspnet* netstandard*
        Pin: origin "packages.microsoft.com"
        Pin-Priority: -10
        
      4. Vuelva a instalar .NET desde la fuente de paquetes de la distribución. Para obtener más información, vea Instalación de .NET en Linux.

    • No

      1. Quite los paquetes .NET existentes de la distribución. Quiere empezar de nuevo y asegurarse de que no los instala desde el repositorio incorrecto.

        sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. Elimine la fuente del repositorio de Microsoft de la distribución.

        sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list
        sudo apt update
        
      3. Vuelva a instalar .NET desde la fuente de paquetes de la distribución. Para obtener más información, vea Instalación de .NET en Linux.

Necesito una versión de .NET que no proporciona mi distribución de Linux

Configure el administrador de paquetes para omitir los paquetes .NET del repositorio de la distribución. Es posible que haya instalado .NET desde ambos repositorios, de modo que quiere elegir uno o el otro.

  1. Quite los paquetes .NET existentes de la distribución. Quiere empezar de nuevo y asegurarse de que no los instala desde el repositorio incorrecto.

    sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
    
  2. Configure el repositorio de Linux para omitir los paquetes .NET.

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

    Asegúrese de reemplazar <your-package-source> por el origen del paquete de la distribución.

  3. Vuelva a instalar .NET desde la fuente de paquetes de la distribución. Para obtener más información, vea Instalación de .NET en Linux.

Configure el administrador de paquetes para omitir los paquetes .NET del repositorio de la distribución. Es posible que haya instalado .NET desde ambos repositorios, de modo que quiere elegir uno o el otro.

  1. Quite los paquetes .NET existentes de la distribución. Quiere empezar de nuevo y asegurarse de que no los instala desde el repositorio incorrecto.

    sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
    
  2. Cree /etc/apt/preferences si no aún no existe.

    touch /etc/apt/preferences
    
  3. Abra /etc/apt/preferences en un editor y agregue un fragmento de preferencias apt para evitar que los paquetes que empiecen por dotnet, aspnetcore o netstandard se originen desde el repositorio de la distribución.

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

    Asegúrese de reemplazar <your-package-source> por el origen del paquete de la distribución.

    La distribución puede tener más de un origen de paquete.

    Por ejemplo, en Ubuntu en Estados Unidos, es posible que tenga que usar un fragmento para archive.ubuntu.com y otro para security.ubuntu.com. Separe cada fragmento con una línea en blanco 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
    

    Sugerencia

    Use el comando apt-cache policy para buscar el origen:

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

    Sugerencia

    Si registró el repositorio de paquetes de backports de Ubuntu .NET debería anular el registro del repositorio de paquetes de backports de Ubuntu .NET en lugar de configurar el administrador de paquetes para omitir los paquetes de .NET incluidos. De lo contrario, el administrador de paquetes extraerá el índice de paquetes de este repositorio, solo para omitirlo, ya que el repositorio solo contiene paquetes de .NET. Esto ralentizará eficazmente la actualización del índice de paquetes locales cada vez que se llame a apt update.

    Use el comando apt-cache policy para comprobar si registró el repositorio de paquetes de backports de Ubuntu .NET:

    apt-cache policy '?name(dotnet.*)' | grep 'ppa.launchpadcontent.net/dotnet/backports' | sort -u
    
  4. Vuelva a instalar .NET desde la fuente de paquetes de Microsoft. Para obtener más información, vea Instalación de .NET en Linux. Si usa Ubuntu, vea Mi distribución de Ubuntu no incluye la versión de .NET que quiero, o bien necesito una versión de .NET no compatible.

Referencias en línea

Muchos otros usuarios han notificado estos problemas. A continuación se muestra una lista de dichos problemas. Puede consultarlos para informarse sobre lo que podría estar sucediendo:

Consulte también