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 (actualmente en versión preliminar), 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.
- Necesito una versión de .NET que no proporciona mi 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?
Sí
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.
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*'
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
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
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*'
Elimine la fuente del repositorio de Microsoft de la distribución.
sudo dnf remove packages-microsoft-prod
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?
Sí
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.
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*'
Cree
/etc/apt/preferences
si no aún no existe.touch /etc/apt/preferences
Abra
/etc/apt/preferences
en un editor y agregue la configuración siguiente. Esto impedirá que los paquetes que empiecen pordotnet
,aspnetcore
onetstandard
se originen desde el repositorio de Microsoft:Package: dotnet* aspnet* netstandard* Pin: origin "packages.microsoft.com" Pin-Priority: -10
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
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*'
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
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.
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*'
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.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.
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*'
Cree
/etc/apt/preferences
si no aún no existe.touch /etc/apt/preferences
Abra
/etc/apt/preferences
en un editor y agregue un fragmento de preferencias apt para evitar que los paquetes que empiecen pordotnet
,aspnetcore
onetstandard
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 parasecurity.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
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:
System.IO.FileNotFoundException y "/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/5.0.0/data/FrameworkList.xml"
- SDK n.º 15785: No se puede compilar un proyecto nuevo después de actualizar a la versión 5.0.3
- SDK n.º 15863: "MSB4018: Error inesperado en la tarea ResolveTargetingPackAssets" después de actualizar a 5.0.103
- SDK n.º 17411: dotnet build siempre produce un error
- SDK n.º 12075: dotnet 3.1.301 en Fedora 32 no encuentra FrameworkList.xml porque no existe
Error grave: No se encontró libhostfxr.so
Error grave: La carpeta /host/fxr no existe
Error grave: La carpeta /host/fxr no contiene carpetas secundarias con número de versión
Errores genéricos sin mensajes claros
- Core n.º 4605: No se puede ejecutar "dotnet new console"
- Core n.º 4644: No se puede instalar el SDK de .NET Core 2.1 en Fedora 32
- Runtime n.º 49375: Después de actualizar a 5.0.200-1 mediante el administrador de paquetes, parece que no hay ningún SDK instalado
- Instalador n.º 16438: la aplicación "--version" no existe