針對 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
資料夾都在您的系統上。
提示
使用 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,因此需要選擇其中之一。
從您的發行版本中移除現有的 .NET 套件。 您想要重新開始,並確認您不會從錯誤的存放庫加以安裝。
sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
將 Microsoft 存放庫設定為忽略 .NET 套件。
echo 'excludepkgs=dotnet*,aspnet*,netstandard*' | sudo tee -a /etc/yum.repos.d/microsoft-prod.repo
從發行版本的套件摘要重新安裝 .NET。 如需詳細資訊,請參閱在 Linus 上安裝 .NET。
否
從您的發行版本中移除現有的 .NET 套件。 您想要重新開始,並確認您不會從錯誤的存放庫加以安裝。
sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
從您的發行版本中刪除 Microsoft 存放庫摘要。
sudo dnf remove packages-microsoft-prod
從發行版本的套件摘要重新安裝 .NET。 如需詳細資訊,請參閱在 Linus 上安裝 .NET。
您是否將 Microsoft 存放庫用於其他套件,例如 PowerShell 和 MSSQL?
是
請將您的套件管理員設定為忽略來自 Microsoft 存放庫的 .NET 套件。 您可能從這兩個存放庫都安裝了 .NET,因此需要選擇其中之一。
從您的發行版本中移除現有的 .NET 套件。 您想要重新開始,並確認您不會從錯誤的存放庫加以安裝。
sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
如果
/etc/apt/preferences
不存在,請予以建立。touch /etc/apt/preferences
在編輯器中開啟
/etc/apt/preferences
並新增下列設定,以防止從 Microsoft 存放庫取得開頭為dotnet
、aspnetcore
或netstandard
的套件:Package: dotnet* aspnet* netstandard* Pin: origin "packages.microsoft.com" Pin-Priority: -10
從發行版本的套件摘要重新安裝 .NET。 如需詳細資訊,請參閱在 Linus 上安裝 .NET。
否
從您的發行版本中移除現有的 .NET 套件。 您想要重新開始,並確認您不會從錯誤的存放庫加以安裝。
sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
從您的發行版本中刪除 Microsoft 存放庫摘要。
sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list sudo apt update
從發行版本的套件摘要重新安裝 .NET。 如需詳細資訊,請參閱在 Linus 上安裝 .NET。
我需要 Linux 發行版本未提供的 .NET 版本
請將您的套件管理員設定為忽略來自發行版本存放庫的 .NET 套件。 您可能從這兩個存放庫都安裝了 .NET,因此需要選擇其中之一。
從您的發行版本中移除現有的 .NET 套件。 您想要重新開始,並確認您不會從錯誤的存放庫加以安裝。
sudo dnf remove 'dotnet*' 'aspnet*' 'netstandard*'
將 Microsoft 存放庫設定為忽略 .NET 套件。
echo 'excludepkgs=dotnet*,aspnet*,netstandard*' | sudo tee -a /etc/yum.repos.d/<your-package-source>.repo
請務必將
<your-package-source>
取代為您的發行版本套件來源。從發行版本的套件摘要重新安裝 .NET。 如需詳細資訊,請參閱在 Linus 上安裝 .NET。
請將您的套件管理員設定為忽略來自發行版本存放庫的 .NET 套件。 您可能從這兩個存放庫都安裝了 .NET,因此需要選擇其中之一。
從您的發行版本中移除現有的 .NET 套件。 您想要重新開始,並確認您不會從錯誤的存放庫加以安裝。
sudo apt remove 'dotnet*' 'aspnet*' 'netstandard*'
如果
/etc/apt/preferences
不存在,請予以建立。touch /etc/apt/preferences
在編輯器中開啟
/etc/apt/preferences
並新增 apt 喜好設定片段,以防止從發行版存放庫取得以dotnet
、aspnetcore
或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 向後移植套件存放庫,您應該 取消註冊 Ubuntu .NET 向後移植套件存放庫,而不是將套件管理員設定為忽略包含的 .NET 套件。 否則,您的套件管理員會從這個存放庫提取套件索引,只是為了忽略它,因為存放庫只包含 .NET 套件。 每次呼叫
apt update
時,這會有效地減緩更新本機套件索引的速度。使用
apt-cache policy
命令來檢查您是否註冊了 Ubuntu .NET 向後移植套件存放庫:apt-cache policy '?name(dotnet.*)' | grep 'ppa.launchpadcontent.net/dotnet/backports' | sort -u
從 Microsoft 套件摘要重新安裝 .NET。 如需詳細資訊,請參閱在 Linus 上安裝 .NET。 若您使用 Ubuntu,請參閱我的 Ubuntu 發行版本不包含我想要的 .NET 版本,或我需要不支援的 .NET 版本。
線上參考
有許多其他使用者回報這些問題。 以下是這些問題的清單。 您可加以瀏覽,以了解可能發生的狀況:
System.IO.FileNotFoundException 和 '/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/5.0.0/data/FrameworkList.xml'
嚴重錯誤:找不到 libhostfxr.so
嚴重錯誤:資料夾 /host/fxr 不存在
嚴重錯誤:資料夾 /host/fxr 不包含任何有版本號碼的子資料夾
沒有明確訊息的一般錯誤