VSCode でC# のLanguage Server が動かない
2023年 11月 21日 火曜日
VSCode でC# のLanguage Server が動かない
dotnet のプロジェクトをVSCode で開いたときに、補完が効かないときの対処法について説明します。 普段はemacs という宗教に入っているのですが、C#のデバッグは現状emacs だと結構大変なので、VSCode でやっています。 他の宗教を知ることが世界平和に繋がります。
Language Server とは
Language Server とは、それまIDE に組み込まれていたプログラミング言語個別の補完やジャンプ等の機能を、サーバーとして切り出したものです。IDE は、Language Server に対して、ファイルの変更や、カーソルの位置などの情報を送り、Language Server は、それに対して、補完候補や、エラー情報などを返します。 Language Server で利用できる機能は、Language Server Protocol (LSP)というもので定義されていて、下記のサイトから参照を行うことができます。 https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/ 実際の Language Server はLSP にて定義された機能を全て実装されているわけではなく、一部の機能のみを実装しているもが多数です。 emacs では lsp-mode というパッケージがあり、これを使うことで、Language Server を利用することができます。
C# のLanguage Server
C# のLanguage Server は、Omnisharp というものが主流です。Omnisharp は、Microsoft のバックアップの元、C# のLanguage Server として、Visual Studio とVisual Studio Code で使われています。
VSCode では C#
というExtension があり、これ内部的に Omnisharp をダウンロードして利用するという構造になっています。
Omnisharp には、ランタイムのコンパイル、コードの補完、ジャンプ等の機能などがあります。
C# をVSCode で開くと、C# Dev Kit
というExtension もインストールを促されますが、これは、Roslyn
というLanguage Server を利用するためのものです。Roslyn
は、C# 構文木、フローの解析、プロジェクト解析、リファクタリング、chtml などASP.NET のファイルの補完などを行うものです。
VSCode に Roslyn と Omnisharp を両方入れるとVisual Studio 的な動きをするようになります。
VSCode でのLanguage Server に起因するトラブルの解決方法
- 下にあるコンパイルエラーと、警告が出る部分をクリックする
- Output タブを開く
- ログの一覧から、Omnisharp Log を選択する
Omnisharp のバージョンが新しすぎる
2023/11/21現在、C# Extension 2.x のバージョンでは dotnet 6 がサポートされていません。dotnet 6.0 に対応するには、C# Extension 1.x にダウングレードする必要があります。
Omnisharp とdotnet のバージョンミスマッチが原因の場合、C#
Extension をダウングレードすることで、解決することができます。
ダウングレードは下記の手順で行います。
- VSCode の Extension を開く
- C# Extension を選択し、
Uninstall
▽ から、Install Another Version
を選択 - 1.x のバージョンを選択し、インストール(1.26.0) をインストール