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 が見つからないこと、またはパッケージが既にインストールされていることを示す一般的なメッセージが表示される場合があります。

これらの問題の 1 つの症状は、/usr/lib64/dotnet/usr/share/dotnet の両方のフォルダーがシステム上にあるということです。

ヒント

dotnet --info コマンドを使用して、インストールされている SDK とランタイムを一覧表示します。 詳細については、.NET が既にインストールされていることを確認する方法に関するページを参照してください。

何が起こっているのでしょうか

これらのエラーは通常、2 つの Linux パッケージ リポジトリにより .NET パッケージが提供されている場合に発生します。 Microsoft では、ソースの .NET パッケージに Linux パッケージ リポジトリを提供していますが、一部の Linux ディストリビューションも .NET パッケージを提供しています。 これらのディストリビューションには、次のものがあります。

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

2 つの異なるソースから .NET パッケージを組み合わせる場合は、問題が発生する可能性があります。 パッケージが異なるパスに配置され、異なる方法でコンパイルされる場合があります。

ソリューション

これらの問題を解決するには、1 つのパッケージ リポジトリの .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 をインストールする」を参照してください。

    • No

      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 を開き、次の設定を追加します。これにより、dotnetaspnetcore、または netstandard で始まるパッケージが Microsoft リポジトリから取得されなくなります。

        Package: dotnet* aspnet* netstandard*
        Pin: origin "packages.microsoft.com"
        Pin-Priority: -10
        
      4. ディストリビューションのパッケージ フィードから .NET を再インストールします。 詳細については、「Linux に .NET をインストールする」を参照してください。

    • No

      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 を開き、次の設定を追加します。これにより、dotnetaspnetcore、または netstandard で始まるパッケージがディストリビューションのリポジトリから取得されなくなります。

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

    <your-package-source> をディストリビューションのパッケージ ソースに置き換えてください。たとえば、Ubuntu では米国の archive.ubuntu.com を使用できます。

    ヒント

    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 バージョンが必要です」を参照してください。

オンライン リファレンス

他の多くのユーザーがこれらの問題を報告しています。 これらの問題の一覧を次に示します。 これらに目を通せば、発生している可能性のあることに関する分析情報が得られます。

関連項目