TIPs of C# – #005. Intelisenseエラーが消えない時の対処法

前提条件

OS:Windows 11
Visual Studio:Community 2022 v17.10.1
フレームワーク:.NET6.0など
プロジェクト:WPFアプリ

突然現れる症状

WPFプロジェクトを作成している際に、突然エディタがエラーまみれになる。

もう少し具体的に書くと、コードビハインドのファイル(MainWindow.xaml.cs)内で、MainWindow関係の関数(InitializeComponent())やXaml(MainWindow.xaml)で定義しているコントロール(Buttonなど)が見つからないというエラーが「エラー一覧」ウィンドウに現れる。当然エディタでも、該当部分に赤い波線が表示され、右側にエラー箇所を示す赤いマークがついたりする。

何か、変なコードを追加してしまったり、逆に削除してしまったりしてエラーになったのかなと、クリーンやリビルドを実行するもビルドは成功している…

エラーは誰が吐いているのか?

エラー一覧タブの右端のコンボボックスで「ビルドのみ」を選択するとエラーは表示されず、「Intellisenseのみ」や「ビルド+Intellisense」にするとエラーが表示されるので、Intellisenseが吐いているエラーだと分かる。

Intelisenseはビルドで利用される構文解析やコンパイラとは異なるので、Intellisenseがエラーを吐くこと自体は不思議ではないが、問題のないプログラムでエラーを吐かれるのは非常に困る。

WPFでイベントハンドラー等を好んで使う自分への嫌がらせだろうか?でもViewModelでも利用必須なInitializeComponent()関数まで見つからないのでそういう事でもないだろう…

エラーが表示されてもビルド・実行できない訳ではないが、エラーまみれのエディタで作業し続けるのは精神衛生上良くないし、慣れてしまうのはもっと問題。

Intellisenseエラーが消えない時の対応法

このエラーは「Intellisenseのデータベースが破損しているから」という情報があり、自分もそうなのだろうと思う。

なので、そのデータベースを修復するか1から作りなおす(なおさせる)のが対応方法となるだろう。

ネットで見つけた対応方法

世の中には、自分と同じ様な事で困っている人はやはりいて、その中で親切な人・まめな人が対応方法を公開してくれたりする。

自分も良くそういった情報にお世話になっているのだが、今回は効果が無かった…。

① Visual Studioを閉じて、ソリューションフォルダの「.vs」フォルダを削除
② Visual Studioを起動してソリューションをオープン
③ ソリューションをリビルド

注:①によって作業状態(開いていたファイルや、編集位置など)は消える。

この後、該当ファイルを開けば、Intellisenseエラーは消えている…はずだが、消えない。

何回繰り返しても、①②の間でPCの再起動を行っても状況が改善しなかった…。

「.vs」フォルダだけでなく、「obj」「bin」フォルダを削除しても改善しなかった…。

(以前同じ現象に遭遇した時には、上記方法で解決した時もあったのだが…)

自分なりの解決策

Intellisenseの状態を何とか初期化する方法はないかとIntellisense関係の設定項目などを調査して見たがそれらしいものは見つからず、頭を抱えていた時に、設定を変えてビルドしたらどうなるだろうと思い、試してみたらうまく行った。

その方法が下記手順。

① ソリューションのプロジェクトの設定を開く

② 「アプリケーション」→ 「全般」の中のターゲットフレームワークを確認

③ ターゲットフレームワークを異なるものに変更

 ※あまりかけ離れたバージョンは、ビルドエラーになる可能性もあるので、近いバージョンを選択。

④ 変更したターゲットフレームワークでリビルド実行

 ※この時点でIntellisenseのエラーは消える。
 ※変更したバージョンの生成物が不要なら、クリーンを実行しておく

⑤ ターゲットフレームワークを元に戻して、リビルド

どうしてこの方法でIntellisenseエラーが解消されるか、詳細は不明だが、おそらくターゲットフレームワークが変更される事で、どこかに存在・管理されているIntellisenseのデータベースなどが初期化されているだろうと思う(個人的な推測) 別のプロジェクトのデータとして再構成されているっぽい(下記追記より)。

自分の環境では、上記の方法で一発で解消したが、解消しない場合はまだ別の要因があるのだろう…。

追記(注意事項)

上記のターゲットフレームを切り替える方法を実行した際に気を付けないといけない点がある。

それは、「obj」「bin」フォルダなどの出力先フォルダ名である。

上記の様にエラーが発生した出力先フォルダ「net6.0-windows」とは別の「net6.0-windows7.0」というフォルダに生成物が出力される事になる点である。

※ターゲットフレームワークを「NET6.0」に戻しても、出力先フォルダは戻らない…。

さて、これを元々の「net6.0-windows」のフォルダ名に戻す場合は、プロジェクトのコードの下記の部分を戻して、Visual Studioを再起動しリビルドすれば良い。

※自分の場合、Visual Studioを再起動した際にしばらくの間Intellisenseのエラーが再発したが、しばらく(数秒~10秒程度?)したら、エラーが消えた…。

いろいろ調べていると、Intellisenseのデータベースファイルは以前は「.vs」フォルダ内にあったようだが、いつのバージョンからか、「C:\Users\(ユーザー名)\AppData\Local\Microsoft\VisualStudio」以下の分かりにくい所へ移動されているっぽい。(「.vs」フォルダを削除しても解決しないのも当然か…)

まとめ

個人的には年に1,2回この症状に遭遇していて、結構悩まされていた。

もし、他の人の役に立てば幸いです。

コメント

  1. Yu Kubota より:

    同じ症状でハマっていたのが解決しました!ありがとうございます!