🆚
[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