🆚

[VS Code] ILSpy が起動に使う .NET 実行ファイルのパスが壊れた時の対処法

に公開

ilspy-vscode を使っていると、ある日突然 ILSpy が起動できなくなることがあります。

今回は、ILSpy が内部で使う .NET 実行ファイルのパスが壊れたときの対処法をまとめます。

発生するエラー

次のようなエラーが表示され、ILSpy が起動できません。

ILSpy Backend client: couldn't create connection to server.
Launching server using command C:\Users\<username>\AppData\Roaming\Code\User\globalStorage\ms-dotnettools.vscode-dotnet-runtime\.dotnet\10.0.5~x64\dotnet.exe failed. Error: spawn C:\Users\<username>\AppData\Roaming\Code\User\globalStorage\ms-dotnettools.vscode-dotnet-runtime\.dotnet\10.0.5~x64\dotnet.exe ENOENT

ポイントは、spawn ... ENOENT です。

これは、ILSpy が起動時に使おうとしている dotnet.exe が見つからないことを意味します。

原因

原因は、ILSpy が参照している .NET 実行ファイルのパスが無効になっていることです。

たとえば次のようなケースで発生します。

  • 一度取得した .NET runtime の保存先が変わった
  • VS Code の拡張機能側が以前のパスを参照し続けている
  • devcontainer ではコンテナ内の .NET を使いたいのに、ホスト側の古いパスを見に行っている

特に devcontainer では、拡張機能が自動取得した runtime よりも、コンテナ内に入っている dotnet を明示的に使わせた方が安定します。

対処法

dotnetAcquisitionExtension.existingDotnetPath に、ILSpy が使う .NET 実行ファイルのパスを指定します。

devcontainer 環境なら、.devcontainer/devcontainer.json に次の設定を追加します。

.devcontainer/devcontainer.json
{
  "customizations": {
    "vscode": {
      "settings": {
        "dotnetAcquisitionExtension.existingDotnetPath": [
          {
            "extensionId": "icsharpcode.ilspy-vscode",
            "path": "/usr/share/dotnet/dotnet"
          }
        ]
      }
    }
  }
}

設定内容の意味は次の通りです。

  • extensionId: この設定を適用する拡張機能。今回は icsharpcode.ilspy-vscode
  • path: ILSpy に使わせる .NET 実行ファイルのパス。devcontainer では /usr/share/dotnet/dotnet

反映手順

設定を追加したあと、devcontainer を再ビルドします。

再ビルド後に ILSpy を開き直して、エラーが出なければ解決です。

補足

今回のようにエラーメッセージ内に Windows のパスが残っている場合、現在の実行環境と ILSpy が参照している .NET の場所がずれている可能性が高いです。

自動取得された runtime に依存させるより、利用する dotnet の実体を明示した方が再発しにくくなります。

Discussion