Bagikan melalui


Memecahkan masalah kesalahan .NET yang terkait dengan file yang hilang di Linux

Ketika Anda mencoba menggunakan .NET di Linux, perintah seperti dotnet new dan dotnet run mungkin gagal dengan pesan yang terkait dengan file yang tidak ditemukan, seperti fxr, libhostfxr.so, atau FrameworkList.xml. Beberapa pesan kesalahan mungkin mirip dengan item berikut:

  • System.IO.FileNotFoundException

    System.IO.FileNotFoundException: Tidak dapat menemukan file '/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/5.0.0/data/FrameworkList.xml'.

  • Terjadi kesalahan fatal.

    Terjadi kesalahan fatal. Pustaka libhostfxr.so yang diperlukan tidak dapat ditemukan.

    or

    Terjadi kesalahan fatal. Folder [/usr/share//dotnethost/fxr] tidak ada.

    or

    Terjadi kesalahan fatal, folder [//usrshare//dotnethost/fxr] tidak berisi folder turunan bernomor versi apa pun.

  • Pesan generik tentang dotnet tidak ditemukan

    Pesan umum mungkin muncul yang menunjukkan SDK tidak ditemukan, atau bahwa paket telah diinstal.

Salah satu gejala dari masalah ini adalah folder /usr/lib64/dotnet dan /usr/share/dotnet berada di sistem Anda.

Tip

dotnet --info Gunakan perintah untuk mencantumkan SDK dan Runtime mana yang diinstal. Untuk informasi lebih lanjut, lihat Cara memeriksa apakah .NET sudah diinstal.

Apa yang terjadi

Kesalahan ini biasanya terjadi ketika dua repositori paket Linux menyediakan paket .NET. Meskipun Microsoft menyediakan repositori paket Linux untuk sumber paket .NET, beberapa distribusi Linux juga menyediakan paket .NET. Distribusi ini meliputi:

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

Jika Anda mencampur paket .NET dari dua sumber yang berbeda, Anda mungkin akan mengalami masalah. Paket mungkin menempatkan hal-hal di jalur yang berbeda dan mungkin dikompilasi secara berbeda.

Solusi

Solusi untuk masalah ini adalah menggunakan .NET dari satu repositori paket. Repositori mana yang harus dipilih, dan cara melakukannya, bervariasi menurut kasus penggunaan dan distribusi Linux.

Distribusi Linux saya menyediakan paket .NET, dan saya ingin menggunakannya

  • Apakah Anda menggunakan repositori Microsoft untuk paket lain, seperti PowerShell dan MSSQL?

    • Ya

      Konfigurasikan manajer paket Anda untuk mengabaikan paket .NET dari repositori Microsoft. Ada kemungkinan Bahwa Anda telah menginstal .NET dari kedua repositori, jadi Anda ingin memilih satu atau yang lain.

      1. Hapus paket .NET yang ada dari distribusi Anda. Anda ingin memulai kembali dan memastikan bahwa Anda tidak menginstalnya dari repositori yang salah.

        sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. Konfigurasikan repositori Microsoft untuk mengabaikan paket .NET.

        echo 'excludepkgs=dotnet*,aspnet*,netstandard*' | sudo tee -a /etc/yum.repos.d/microsoft-prod.repo
        
      3. Instal ulang .NET dari umpan paket distribusi. Untuk informasi selengkapnya, lihat Menginstal .NET di Linux.

    • Tidak

      1. Hapus paket .NET yang ada dari distribusi Anda. Anda ingin memulai kembali dan memastikan bahwa Anda tidak menginstalnya dari repositori yang salah.

        sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. Hapus umpan repositori Microsoft dari distribusi Anda.

        sudo dnf remove packages-microsoft-prod
        
      3. Instal ulang .NET dari umpan paket distribusi. Untuk informasi selengkapnya, lihat Menginstal .NET di Linux.

  • Apakah Anda menggunakan repositori Microsoft untuk paket lain, seperti PowerShell dan MSSQL?

    • Ya

      Konfigurasikan manajer paket Anda untuk mengabaikan paket .NET dari repositori Microsoft. Ada kemungkinan Bahwa Anda telah menginstal .NET dari kedua repositori, jadi Anda ingin memilih satu atau yang lain.

      1. Hapus paket .NET yang ada dari distribusi Anda. Anda ingin memulai kembali dan memastikan bahwa Anda tidak menginstalnya dari repositori yang salah.

        sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. Buat /etc/apt/preferences, jika belum ada.

        touch /etc/apt/preferences
        
      3. Buka /etc/apt/preferences di editor dan tambahkan pengaturan berikut, yang mencegah paket yang dimulai dengan dotnet, , aspnetcoreatau netstandard bersumber dari repositori Microsoft:

        Package: dotnet* aspnet* netstandard*
        Pin: origin "packages.microsoft.com"
        Pin-Priority: -10
        
      4. Instal ulang .NET dari umpan paket distribusi. Untuk informasi selengkapnya, lihat Menginstal .NET di Linux.

    • Tidak

      1. Hapus paket .NET yang ada dari distribusi Anda. Anda ingin memulai kembali dan memastikan bahwa Anda tidak menginstalnya dari repositori yang salah.

        sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. Hapus umpan repositori Microsoft dari distribusi Anda.

        sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list
        sudo apt update
        
      3. Instal ulang .NET dari umpan paket distribusi. Untuk informasi selengkapnya, lihat Menginstal .NET di Linux.

Saya memerlukan versi .NET yang tidak disediakan oleh distribusi Linux saya

Konfigurasikan manajer paket Anda untuk mengabaikan paket .NET dari repositori distribusi. Ada kemungkinan Bahwa Anda telah menginstal .NET dari kedua repositori, jadi Anda ingin memilih satu atau yang lain.

  1. Hapus paket .NET yang ada dari distribusi Anda. Anda ingin memulai kembali dan memastikan bahwa Anda tidak menginstalnya dari repositori yang salah.

    sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
    
  2. Konfigurasikan repositori Linux untuk mengabaikan paket .NET.

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

    Pastikan untuk mengganti <your-package-source> dengan sumber paket distribusi Anda.

  3. Instal ulang .NET dari umpan paket distribusi. Untuk informasi selengkapnya, lihat Menginstal .NET di Linux.

Konfigurasikan manajer paket Anda untuk mengabaikan paket .NET dari repositori distribusi. Ada kemungkinan Bahwa Anda telah menginstal .NET dari kedua repositori, jadi Anda ingin memilih satu atau yang lain.

  1. Hapus paket .NET yang ada dari distribusi Anda. Anda ingin memulai kembali dan memastikan bahwa Anda tidak menginstalnya dari repositori yang salah.

    sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
    
  2. Buat /etc/apt/preferences, jika belum ada.

    touch /etc/apt/preferences
    
  3. Buka /etc/apt/preferences di editor dan tambahkan fragemen preferensi apt untuk mencegah paket yang dimulai dengan dotnet, , aspnetcoreatau netstandard bersumber dari repositori distribusi.

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

    Pastikan untuk mengganti <your-package-source> dengan sumber paket distribusi Anda.

    Distribusi Anda mungkin memiliki lebih dari satu sumber paket.

    Misalnya, pada Ubuntu di AS, Anda mungkin perlu menggunakan satu fragmen untuk archive.ubuntu.com dan yang lain untuk security.ubuntu.com. Pisahkan setiap fragmen dengan baris kosong seperti ini:

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

    Tip

    apt-cache policy Gunakan perintah untuk menemukan sumber:

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

    Tip

    Jika Anda mendaftarkan repositori paket backport Ubuntu .NET, Anda harus membatalkan pendaftaran repositori paket backport Ubuntu .NET alih-alih mengonfigurasi manajer paket Anda untuk mengabaikan paket .NET yang terkandung. Jika tidak, manajer paket Anda menarik indeks paket dari repositori ini, hanya untuk mengabaikannya, karena repositori hanya berisi paket .NET. Ini secara efektif memperlambat pembaruan indeks paket lokal Anda setiap kali Anda memanggil apt update.

    apt-cache policy Gunakan perintah untuk memeriksa apakah Anda mendaftarkan repositori paket backport ubuntu .NET:

    apt-cache policy '?name(dotnet.*)' | grep 'ppa.launchpadcontent.net/dotnet/backports' | sort -u
    
  4. Instal ulang .NET dari umpan paket Microsoft. Untuk informasi selengkapnya, lihat Menginstal .NET di Linux. Jika menggunakan Ubuntu, lihat Distribusi Ubuntu saya tidak menyertakan versi .NET yang saya inginkan, atau saya memerlukan versi .NET yang tidak didukung.

Referensi online

Banyak pengguna lain telah melaporkan masalah ini. Berikut ini adalah daftar masalah tersebut. Anda dapat membacanya untuk wawasan tentang apa yang mungkin terjadi:

Lihat juga