Udostępnij za pośrednictwem


Rozwiązywanie problemów z błędami platformy .NET związanymi z brakującymi plikami w systemie Linux

Podczas próby użycia platformy .NET w systemie Linux polecenia, takie jak dotnet new i dotnet run mogą zakończyć się niepowodzeniem z komunikatem związanym z nieznajdącym się plikiem, takim jak fxr, libhostfxr.solub FrameworkList.xml. Niektóre komunikaty o błędach mogą być podobne do następujących elementów:

  • System.IO.FileNotFoundException

    System.IO.FileNotFoundException: Nie można odnaleźć pliku '//usr/share/dotnetpacks/Microsoft.NETCore.App.Ref/5.0.0/data/FrameworkList.xml'.

  • Wystąpił błąd krytyczny.

    Wystąpił błąd krytyczny. Nie można odnaleźć wymaganej biblioteki libhostfxr.so .

    lub

    Wystąpił błąd krytyczny. Folder [//usrshare//dotnethost/fxr] nie istnieje.

    lub

    Wystąpił błąd krytyczny, folder [//usrshare//dotnethost/fxr] nie zawiera żadnych folderów podrzędnych z numerem wersji.

  • Komunikaty ogólne dotyczące dotnet nie znaleziono

    Może pojawić się komunikat ogólny wskazujący, że zestaw SDK nie został znaleziony lub że pakiet został już zainstalowany.

Jednym z objawów tych problemów jest to, że zarówno foldery /usr/lib64/dotnet , jak i /usr/share/dotnet znajdują się w systemie.

Napiwek

Użyj polecenia , dotnet --info aby wyświetlić listę zainstalowanych zestawów SDK i środowisk uruchomieniowych. Aby uzyskać więcej informacji, zobacz Jak sprawdzić, czy platforma .NET jest już zainstalowana.

Co się dzieje

Ważne

Począwszy od platformy .NET 9 (obecnie w wersji zapoznawczej), firma Microsoft publikuje tylko pakiety dla obsługiwanych dystrybucji systemu Linux, które nie publikują własnych pakietów. Aby uzyskać więcej informacji, zobacz Instalowanie platformy .NET w systemie Linux.

Te błędy zwykle występują, gdy dwa repozytoria pakietów systemu Linux udostępniają pakiety .NET. Chociaż firma Microsoft udostępnia repozytorium pakietów systemu Linux do źródłowych pakietów .NET, niektóre dystrybucje systemu Linux udostępniają również pakiety .NET. Te dystrybucje obejmują:

  • Alpine Linux
  • Łuk
  • Strumień centOS
  • Fedora
  • RHEL
  • Ubuntu 22.04+

Jeśli połączysz pakiety .NET z dwóch różnych źródeł, prawdopodobnie wystąpią problemy. Pakiety mogą umieszczać elementy w różnych ścieżkach i mogą być kompilowane inaczej.

Rozwiązania

Rozwiązaniem tych problemów jest użycie platformy .NET z jednego repozytorium pakietów. Które repozytorium należy wybrać i jak to zrobić, różni się w zależności od przypadku użycia i dystrybucji systemu Linux.

Moja dystrybucja systemu Linux udostępnia pakiety .NET i chcę ich używać

  • Czy używasz repozytorium Firmy Microsoft dla innych pakietów, takich jak program PowerShell i program MSSQL?

    • Tak

      Skonfiguruj menedżera pakietów tak, aby ignorował pakiety .NET z repozytorium firmy Microsoft. Możliwe, że zainstalowano platformę .NET z obu repozytoriów, więc chcesz wybrać jedną lub drugą.

      1. Usuń istniejące pakiety .NET z dystrybucji. Chcesz zacząć od nowa i upewnić się, że nie instalujesz ich z nieprawidłowego repozytorium.

        sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. Skonfiguruj repozytorium firmy Microsoft tak, aby ignorowało pakiety .NET.

        echo 'excludepkgs=dotnet*,aspnet*,netstandard*' | sudo tee -a /etc/yum.repos.d/microsoft-prod.repo
        
      3. Zainstaluj ponownie platformę .NET z kanału informacyjnego pakietów dystrybucji. Aby uzyskać więcej informacji, zobacz Instalowanie platformy .NET w systemie Linux.

    • Nie

      1. Usuń istniejące pakiety .NET z dystrybucji. Chcesz zacząć od nowa i upewnić się, że nie instalujesz ich z nieprawidłowego repozytorium.

        sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. Usuń źródło danych repozytorium firmy Microsoft z dystrybucji.

        sudo dnf remove packages-microsoft-prod
        
      3. Zainstaluj ponownie platformę .NET z kanału informacyjnego pakietów dystrybucji. Aby uzyskać więcej informacji, zobacz Instalowanie platformy .NET w systemie Linux.

  • Czy używasz repozytorium Firmy Microsoft dla innych pakietów, takich jak program PowerShell i program MSSQL?

    • Tak

      Skonfiguruj menedżera pakietów tak, aby ignorował pakiety .NET z repozytorium firmy Microsoft. Możliwe, że zainstalowano platformę .NET z obu repozytoriów, więc chcesz wybrać jedną lub drugą.

      1. Usuń istniejące pakiety .NET z dystrybucji. Chcesz zacząć od nowa i upewnić się, że nie instalujesz ich z nieprawidłowego repozytorium.

        sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. Utwórz /etc/apt/preferencesplik , jeśli jeszcze nie istnieje.

        touch /etc/apt/preferences
        
      3. Otwórz /etc/apt/preferences plik w edytorze i dodaj następujące ustawienia, które uniemożliwiają uruchamianie pakietów rozpoczynających się od dotnet, aspnetcorelub netstandard z repozytorium firmy Microsoft:

        Package: dotnet* aspnet* netstandard*
        Pin: origin "packages.microsoft.com"
        Pin-Priority: -10
        
      4. Zainstaluj ponownie platformę .NET z kanału informacyjnego pakietów dystrybucji. Aby uzyskać więcej informacji, zobacz Instalowanie platformy .NET w systemie Linux.

    • Nie

      1. Usuń istniejące pakiety .NET z dystrybucji. Chcesz zacząć od nowa i upewnić się, że nie instalujesz ich z nieprawidłowego repozytorium.

        sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. Usuń źródło danych repozytorium firmy Microsoft z dystrybucji.

        sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list
        sudo apt update
        
      3. Zainstaluj ponownie platformę .NET z kanału informacyjnego pakietów dystrybucji. Aby uzyskać więcej informacji, zobacz Instalowanie platformy .NET w systemie Linux.

Potrzebuję wersji platformy .NET, która nie jest dostarczana przez dystrybucję systemu Linux

Skonfiguruj menedżera pakietów tak, aby ignorował pakiety .NET z repozytorium dystrybucji. Możliwe, że zainstalowano platformę .NET z obu repozytoriów, więc chcesz wybrać jedną lub drugą.

  1. Usuń istniejące pakiety .NET z dystrybucji. Chcesz zacząć od nowa i upewnić się, że nie instalujesz ich z nieprawidłowego repozytorium.

    sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
    
  2. Skonfiguruj repozytorium systemu Linux, aby ignorować pakiety platformy .NET.

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

    Pamiętaj, aby zastąpić <your-package-source> element źródłem pakietu dystrybucji.

  3. Zainstaluj ponownie platformę .NET z kanału informacyjnego pakietów dystrybucji. Aby uzyskać więcej informacji, zobacz Instalowanie platformy .NET w systemie Linux.

Skonfiguruj menedżera pakietów tak, aby ignorował pakiety .NET z repozytorium dystrybucji. Możliwe, że zainstalowano platformę .NET z obu repozytoriów, więc chcesz wybrać jedną lub drugą.

  1. Usuń istniejące pakiety .NET z dystrybucji. Chcesz zacząć od nowa i upewnić się, że nie instalujesz ich z nieprawidłowego repozytorium.

    sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
    
  2. Utwórz /etc/apt/preferencesplik , jeśli jeszcze nie istnieje.

    touch /etc/apt/preferences
    
  3. Otwórz /etc/apt/preferences plik w edytorze i dodaj preferencję apt, aby zapobiec uruchamianiu pakietów rozpoczynających się od dotnet, aspnetcorelub netstandard z repozytorium dystrybucji.

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

    Pamiętaj, aby zastąpić <your-package-source> element źródłem pakietu dystrybucji.

    Dystrybucja może mieć więcej niż jedno źródło pakietu.

    Na przykład w systemie Ubuntu w Stanach Zjednoczonych może być konieczne użycie jednego fragmentu dla archive.ubuntu.com elementu i innego dla elementu security.ubuntu.com. Oddziel każdy fragment pustym wierszem w następujący sposób:

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

    Napiwek

    Użyj polecenia , apt-cache policy aby znaleźć źródło:

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

    Napiwek

    Jeśli zarejestrowano repozytorium pakietów backports systemu Ubuntu .NET, należy wyrejestrować repozytorium pakietów backports platformy Ubuntu .NET zamiast konfigurować menedżera pakietów w celu ignorowania zawartych pakietów .NET. W przeciwnym razie menedżer pakietów ściąga indeks pakietu z tego repozytorium, aby go zignorować, ponieważ repozytorium zawiera tylko pakiety .NET. To skutecznie spowalnia aktualizowanie lokalnego indeksu pakietów za każdym razem, gdy wywołasz metodę apt update.

    apt-cache policy Użyj polecenia , aby sprawdzić, czy zarejestrowano repozytorium pakietów backports platformy Ubuntu .NET:

    apt-cache policy '?name(dotnet.*)' | grep 'ppa.launchpadcontent.net/dotnet/backports' | sort -u
    
  4. Zainstaluj ponownie platformę .NET z kanału informacyjnego pakietów firmy Microsoft. Aby uzyskać więcej informacji, zobacz Instalowanie platformy .NET w systemie Linux. Jeśli używasz systemu Ubuntu, zobacz Moja dystrybucja systemu Ubuntu nie zawiera żądanej wersji platformy .NET lub potrzebuję wersji platformy .NET, która nie jest obsługiwana.

Odwołania online

Wielu innych użytkowników zgłosiło te problemy. Poniżej znajduje się lista tych problemów. Możesz je przeczytać, aby uzyskać szczegółowe informacje na temat tego, co może się zdarzyć:

Zobacz też