다음을 통해 공유


Linux에서 누락된 파일과 관련된 .NET 오류 문제 해결

Linux에서 .NET을 사용하려고 하면 dotnet new, dotnet run 등의 명령이 실패하고 fxr, libhostfxr.so 또는 FrameworkList.xml 등의 파일을 찾을 수 없다는 메시지가 표시될 수 있습니다. 오류 메시지 몇 가지는 다음 항목과 유사할 수 있습니다.

  • System.IO.FileNotFoundException

    System.IO.FileNotFoundException: '/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/5.0.0/data/FrameworkList.xml’ 파일을 찾을 수 없습니다.

  • 오류가 발생했습니다.

    오류가 발생했습니다. 필수 라이브러리 libhostfxr.so를 찾을 수 없습니다.

    또는

    오류가 발생했습니다. [/usr/share/dotnet/host/fxr] 폴더가 없습니다.

    또는

    오류가 발생했습니다. [/usr/share/dotnet/host/fxr] 폴더에 버전 번호가 매겨진 자식 폴더가 없습니다.

  • dotnet을 찾을 수 없음에 관한 일반 메시지

    SDK를 찾을 수 없거나 패키지가 이미 설치되어 있음을 나타내는 일반 메시지가 표시될 수 있습니다.

이러한 문제의 한 가지 증상은 /usr/lib64/dotnet/usr/share/dotnet 폴더가 모두 시스템에 있다는 것입니다.

설치된 SDK 및 런타임을 나열하려면 dotnet --info 명령을 사용합니다. 자세한 내용은 .NET이 이미 설치되어 있는지 확인하는 방법을 참조하세요.

문제의 원인

Important

.NET 9부터 Microsoft는 자체 패키지를 게시하지 않는 지원되는 Linux 배포판용 패키지만 게시합니다. 자세한 내용은 Linux에 .NET 설치를 참조하세요.

이러한 오류는 일반적으로 두 개의 Linux 패키지 리포지토리가 .NET 패키지를 제공할 때 발생합니다. Microsoft는 .NET 패키지를 제공하기 위해 하나의 Linux 패키지 리포지토리를 제공하지만, 일부 Linux 배포판은 .NET 패키지도 제공합니다. 이러한 배포판에는 다음이 포함됩니다.

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

서로 다른 두 원본의 .NET 패키지를 혼합하면 문제가 발생할 가능성이 높습니다. 패키지는 항목을 다른 경로에 배치할 수 있으며 다르게 컴파일될 수 있습니다.

해결 방법

이 문제의 해결 방법은 패키지 리포지토리 하나의 .NET을 사용하는 것입니다. 선택할 리포지토리와 선택 방법은 사용 사례 및 Linux 배포판에 따라 다릅니다.

내 Linux 배포판은 .NET 패키지를 제공하며 이를 사용하려고 합니다.

  • PowerShell 및 MSSQL과 같은 다른 패키지에 대해 Microsoft 리포지토리를 사용하나요?

    • Microsoft 리포지토리의 .NET 패키지를 무시하도록 패키지 관리자를 구성합니다. 두 리포지토리 모두에서 .NET을 설치했을 수 있으므로 둘 중 하나를 선택하려고 합니다.

      1. 배포에서 기존 .NET 패키지를 제거합니다. 다시 시작하고 잘못된 리포지토리에서 설치하지 않았는지 확인하려고 합니다.

        sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. .NET 패키지를 무시하도록 Microsoft 리포지토리를 구성합니다.

        echo 'excludepkgs=dotnet*,aspnet*,netstandard*' | sudo tee -a /etc/yum.repos.d/microsoft-prod.repo
        
      3. 배포 패키지 피드에서 .NET을 다시 설치합니다. 자세한 내용은 Linux에 .NET 설치를 참조하세요.

    • 문제

      1. 배포에서 기존 .NET 패키지를 제거합니다. 다시 시작하고 잘못된 리포지토리에서 설치하지 않았는지 확인하려고 합니다.

        sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. 배포에서 Microsoft 리포지토리 피드를 삭제합니다.

        sudo dnf remove packages-microsoft-prod
        
      3. 배포 패키지 피드에서 .NET을 다시 설치합니다. 자세한 내용은 Linux에 .NET 설치를 참조하세요.

  • PowerShell 및 MSSQL과 같은 다른 패키지에 대해 Microsoft 리포지토리를 사용하나요?

    • Microsoft 리포지토리의 .NET 패키지를 무시하도록 패키지 관리자를 구성합니다. 두 리포지토리 모두에서 .NET을 설치했을 수 있으므로 둘 중 하나를 선택하려고 합니다.

      1. 배포에서 기존 .NET 패키지를 제거합니다. 다시 시작하고 잘못된 리포지토리에서 설치하지 않았는지 확인하려고 합니다.

        sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. 아직 존재하지 않는 경우 /etc/apt/preferences를 만듭니다.

        touch /etc/apt/preferences
        
      3. 편집기에서 /etc/apt/preferences를 열고 다음 설정을 추가하여 dotnet, aspnetcore 또는 netstandard로 시작하는 패키지가 Microsoft 리포지토리에서 제공되지 않도록 합니다.

        Package: dotnet* aspnet* netstandard*
        Pin: origin "packages.microsoft.com"
        Pin-Priority: -10
        
      4. 배포 패키지 피드에서 .NET을 다시 설치합니다. 자세한 내용은 Linux에 .NET 설치를 참조하세요.

    • 문제

      1. 배포에서 기존 .NET 패키지를 제거합니다. 다시 시작하고 잘못된 리포지토리에서 설치하지 않았는지 확인하려고 합니다.

        sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. 배포에서 Microsoft 리포지토리 피드를 삭제합니다.

        sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list
        sudo apt update
        
      3. 배포 패키지 피드에서 .NET을 다시 설치합니다. 자세한 내용은 Linux에 .NET 설치를 참조하세요.

내 Linux 배포판에서 제공하지 않는 .NET 버전이 필요합니다.

배포 리포지토리에서 .NET 패키지를 무시하도록 패키지 관리자를 구성합니다. 두 리포지토리 모두에서 .NET을 설치했을 수 있으므로 둘 중 하나를 선택하려고 합니다.

  1. 배포에서 기존 .NET 패키지를 제거합니다. 다시 시작하고 잘못된 리포지토리에서 설치하지 않았는지 확인하려고 합니다.

    sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
    
  2. .NET 패키지를 무시하도록 Linux 리포지토리를 구성합니다.

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

    <your-package-source>를 배포판의 패키지 원본으로 바꿉니다.

  3. 배포 패키지 피드에서 .NET을 다시 설치합니다. 자세한 내용은 Linux에 .NET 설치를 참조하세요.

배포 리포지토리에서 .NET 패키지를 무시하도록 패키지 관리자를 구성합니다. 두 리포지토리 모두에서 .NET을 설치했을 수 있으므로 둘 중 하나를 선택하려고 합니다.

  1. 배포에서 기존 .NET 패키지를 제거합니다. 다시 시작하고 잘못된 리포지토리에서 설치하지 않았는지 확인하려고 합니다.

    sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
    
  2. 아직 존재하지 않는 경우 /etc/apt/preferences를 만듭니다.

    touch /etc/apt/preferences
    
  3. 편집기에서 열고 /etc/apt/preferences apt 기본 설정 조각을 추가하여 배포의 리포지토리에서 시작dotnetaspnetcore하거나 netstandard 원본이 되는 패키지를 방지합니다.

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

    <your-package-source>를 배포판의 패키지 원본으로 바꿉니다.

    배포에는 둘 이상의 패키지 원본이 있을 수 있습니다.

    예를 들어 미국의 Ubuntu에서는 archive.ubuntu.com에 하나의 조각을 사용하고 security.ubuntu.com에 다른 조각을 사용해야 할 수 있습니다. 각 조각을 다음과 같이 빈 줄로 구분합니다.

    Package: dotnet* aspnet* netstandard*
    Pin: origin "archive.ubuntu.com"
    Pin-Priority: -10
    
    Package: dotnet* aspnet* netstandard*
    Pin: origin "security.ubuntu.com"
    Pin-Priority: -10
    

    원본을 찾으려면 apt-cache policy 명령을 사용합니다.

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

    Ubuntu .NET 백포트 패키지 리포지토리를 등록한 경우, 포함된 .NET 패키지를 무시하도록 패키지 관리자를 구성하는 대신 Ubuntu .NET 백포트 패키지 리포지토리의 등록을 취소해야 합니다 . 그렇지 않으면 패키지 관리자는 리포지토리에 .NET 패키지만 포함되므로 이 리포지토리에서 패키지 인덱스를 끌어와서 그냥 무시하게 됩니다. 이렇게 하면 apt update를 호출할 때마다 로컬 패키지 인덱스를 업데이트하면서 사실상 속도가 느려집니다.

    apt-cache policy 명령을 사용하여 Ubuntu .NET 백포트 패키지 리포지토리를 등록했는지 확인합니다.

    apt-cache policy '?name(dotnet.*)' | grep 'ppa.launchpadcontent.net/dotnet/backports' | sort -u
    
  4. Microsoft 패키지 피드에서 .NET을 다시 설치합니다. 자세한 내용은 Linux에 .NET 설치를 참조하세요. Ubuntu를 사용하는 경우 내 Ubuntu 배포판에 원하는 .NET 버전이 포함되어 있지 않거나 지원되지 않는 .NET 버전이 필요합니다를 참조하세요.

온라인 참조

다른 많은 사용자들이 이러한 문제를 보고했습니다. 다음은 이러한 문제의 목록입니다. 발생할 수 있는 일에 대한 인사이트를 얻으려면 다음을 참조하세요.

참고 항목