分享方式:


針對 Linux 上與缺少檔案有關的 .NET 錯誤進行疑難排解

當您嘗試在 Linux 上使用 .NET 時,dotnet newdotnet run 這類命令可能會失敗,並出現與找不到檔案相關的訊息,例如 fxrlibhostfxr.soFrameworkList.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 資料夾都在您的系統上。

提示

使用 dotnet --info 命令來列出已安裝的 SDK 和 Runtime。 如需詳細資訊,請參閱如何檢查是否已安裝

發生什麼情況

重要

從 .NET 9 開始(目前為預覽版),Microsoft只會針對未發佈自己套件的支援 Linux 發行版發佈套件。 如需詳細資訊,請參閱在 Linus 上安裝 .NET

這些錯誤通常發生在有兩個 Linux 套件存放庫提供 .NET 套件的情況。 雖然 Microsoft 提供了 Linux 套件存放庫來取得 .NET 套件,但有些 Linux 發行版本也提供 .NET 套件。 這些發行版本包括:

  • Alpine Linux
  • 架構
  • CentOS 資料流
  • Fedora
  • RHEL
  • Ubuntu 22.04+

如果您混用來自兩個不同來源的 .NET 套件,可能會發生問題。 套件可能將項目放在不同的路徑,而且可能以不同的方式編譯。

方案

這些問題的解決方案,是從一個套件存放庫使用 .NET。 要挑選的存放庫及執行方法,會因使用案例和 Linux 發行版本而異。

我的 Linux 發行版本提供 .NET 套件,而我想要使用這些套件

  • 您是否將 Microsoft 存放庫用於其他套件,例如 PowerShell 和 MSSQL?

    • 請將您的套件管理員設定為忽略來自 Microsoft 存放庫的 .NET 套件。 您可能從這兩個存放庫都安裝了 .NET,因此需要選擇其中之一。

      1. 從您的發行版本中移除現有的 .NET 套件。 您想要重新開始,並確認您不會從錯誤的存放庫加以安裝。

        sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. 將 Microsoft 存放庫設定為忽略 .NET 套件。

        echo 'excludepkgs=dotnet*,aspnet*,netstandard*' | sudo tee -a /etc/yum.repos.d/microsoft-prod.repo
        
      3. 從發行版本的套件摘要重新安裝 .NET。 如需詳細資訊,請參閱在 Linus 上安裝 .NET

      1. 從您的發行版本中移除現有的 .NET 套件。 您想要重新開始,並確認您不會從錯誤的存放庫加以安裝。

        sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. 從您的發行版本中刪除 Microsoft 存放庫摘要。

        sudo dnf remove packages-microsoft-prod
        
      3. 從發行版本的套件摘要重新安裝 .NET。 如需詳細資訊,請參閱在 Linus 上安裝 .NET

  • 您是否將 Microsoft 存放庫用於其他套件,例如 PowerShell 和 MSSQL?

    • 請將您的套件管理員設定為忽略來自 Microsoft 存放庫的 .NET 套件。 您可能從這兩個存放庫都安裝了 .NET,因此需要選擇其中之一。

      1. 從您的發行版本中移除現有的 .NET 套件。 您想要重新開始,並確認您不會從錯誤的存放庫加以安裝。

        sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
        
      2. 如果 /etc/apt/preferences 不存在,請予以建立。

        touch /etc/apt/preferences
        
      3. 在編輯器中開啟 /etc/apt/preferences 並新增下列設定,以防止從 Microsoft 存放庫取得開頭為 dotnetaspnetcorenetstandard 的套件:

        Package: dotnet* aspnet* netstandard*
        Pin: origin "packages.microsoft.com"
        Pin-Priority: -10
        
      4. 從發行版本的套件摘要重新安裝 .NET。 如需詳細資訊,請參閱在 Linus 上安裝 .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。 如需詳細資訊,請參閱在 Linus 上安裝 .NET

我需要 Linux 發行版本未提供的 .NET 版本

請將您的套件管理員設定為忽略來自發行版本存放庫的 .NET 套件。 您可能從這兩個存放庫都安裝了 .NET,因此需要選擇其中之一。

  1. 從您的發行版本中移除現有的 .NET 套件。 您想要重新開始,並確認您不會從錯誤的存放庫加以安裝。

    sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
    
  2. 將 Microsoft 存放庫設定為忽略 .NET 套件。

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

    請務必將 <your-package-source> 取代為您的發行版本套件來源。

  3. 從發行版本的套件摘要重新安裝 .NET。 如需詳細資訊,請參閱在 Linus 上安裝 .NET

請將您的套件管理員設定為忽略來自發行版本存放庫的 .NET 套件。 您可能從這兩個存放庫都安裝了 .NET,因此需要選擇其中之一。

  1. 從您的發行版本中移除現有的 .NET 套件。 您想要重新開始,並確認您不會從錯誤的存放庫加以安裝。

    sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
    
  2. 如果 /etc/apt/preferences 不存在,請予以建立。

    touch /etc/apt/preferences
    
  3. 在編輯器中開啟 /etc/apt/preferences 並新增 apt 喜好設定片段,以防止從發行版存放庫取得以 dotnetaspnetcorenetstandard 開頭的套件。

    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 向後移植套件存放庫,您應該 取消註冊 Ubuntu .NET 向後移植套件存放庫,而不是將套件管理員設定為忽略包含的 .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。 如需詳細資訊,請參閱在 Linus 上安裝 .NET。 若您使用 Ubuntu,請參閱我的 Ubuntu 發行版本不包含我想要的 .NET 版本,或我需要不支援的 .NET 版本

線上參考

有許多其他使用者回報這些問題。 以下是這些問題的清單。 您可加以瀏覽,以了解可能發生的狀況:

另請參閱