Visual StudioのVBで「Application は Windows のメンバーではありません」エラーが突然出る原因と解決策(Windows.Application対処)

Visual StudioでVB.NETの既存ソリューションを開いた途端、昨日まで問題なかったWindows.Application周りが突然赤くなり、「'Application' is not a member of 'Windows'.(Application は Windows のメンバーではありません)」でコンパイルが止まる――。この症状は“キャッシュ不整合”と“名前空間の衝突”の2系統で説明でき、対処の順番を間違えなければ短時間で復旧できます。

目次

突然のコンパイルエラー「Application は Windows のメンバーではありません」とは

エラー文そのものはシンプルですが、実際は「Windowsが何を指しているか」が前日と変わってしまったときに起きやすいトラブルです。特にVB.NETは、プロジェクト設定(インポート/ルート名前空間)や参照追加(WinRT系、Windows SDK系)によって名前解決の優先順位が変わり、同じコードでも突然解釈が変わることがあります。

症状よくある背景最短ルートの対処
Windows.Applicationでコンパイルエラー名前空間の解釈が変わった/衝突した完全修飾名(System.Windows.Application)へ変更
IntelliSenseもおかしい、参照が飛ぶVisual Studio側キャッシュ破損・不整合.vs削除+bin/obj削除+再ビルド
NuGet参照が絡む型でだけエラー復元漏れ・キャッシュ汚れ・ローカル差分NuGetキャッシュクリア+Restore

まず最初に押さえるポイント:Windows.Applicationが危うい理由

WPFのApplicationクラスは通常System.Windows.Applicationにあります。一方で、Windows/WinRT系の開発要素を参照すると、トップレベルにWindowsという巨大な名前空間(例:Windows.ApplicationModel等)が入ってきます。

この状態でWindows.Applicationと書くと、コンパイラはまず「トップレベルのWindows」を候補に取り、そこにApplicationというメンバー(型)が見つからないため、今回のようなエラーになり得ます。つまり、原因は「Applicationが消えた」ではなく、“Windowsが別物として解釈されるようになった”ことが本質です。

あなたが呼び出したいもの正しい完全修飾名の例よくある誤記/曖昧表記
WPFのApplicationSystem.Windows.ApplicationWindows.Application
WinFormsのApplicationSystem.Windows.Forms.ApplicationWindows.Forms.Application
VBのアプリケーションオブジェクト(My)My.ApplicationApplication(どれのApplicationか不明になりやすい)
WinRT/Windows SDK系Windows.ApplicationModel...などWPF/WinFormsのつもりでWindowsを直書き

最短で切り分ける:原因はA(キャッシュ)かB(衝突)か

「前日までOKで翌日突然」という状況は、以下のどちらでも起きます。そこで、遠回りしないために切り分け順を固定します。

切り分けのコツ

  • 同じ型名/名前空間のエラーが一斉に増えた → キャッシュ不整合の可能性が高い
  • Windows.Applicationのような“省略表記だけ”が死んでいる → 名前空間衝突の可能性が高い
  • System.Windows.Applicationに書き換えると即直る → ほぼ衝突確定

以降は「まずAで環境を整える → ダメならBで確実に直す」の順で説明します。実際の報告でも、Aのキャッシュ整理や修復では解決せず、Bの完全修飾名に変更したら解消したケースが多く見られます。

解決策A:キャッシュ/環境修復(まず試す基本手順)

Visual Studioは、ソリューションを開くたびに多くの情報(IntelliSense、参照解決、ビルド中間生成物など)をキャッシュします。これが不整合を起こすと、コード自体に問題がなくても「突然エラーになったように見える」状態になります。Aは“環境側のゆがみ”を正すための手順です。

.vsフォルダをリネーム/削除して再ビルド

ソリューション直下にある隠しフォルダ.vsは、Visual Studioの一時情報の塊です。破損や古い情報の残留があると、参照解決が変な状態に固定されることがあります。

  1. Visual Studioを完全に終了(念のためタスクマネージャーでdevenv.exeが残っていないか確認)
  2. エクスプローラーでソリューションフォルダを開く
  3. 隠しフォルダ.vsをリネーム(例:.vs_old)または削除
  4. ソリューションを開き直してRebuild

削除しても安全です(個人ローカルのキャッシュが再生成されるだけ)。チーム開発でも、ソース管理に入れるべきものではありません。

bin/objを削除してビルド生成物をリセット

.vsはIDE側ですが、ビルド生成物側(MSBuildの中間生成物)も不整合を起こします。各プロジェクト配下のbinとobjを削除してから再ビルドすると、参照周りの“謎の残骸”が消えます。

  • ソリューション全体でエラーが連鎖している
  • 参照先DLLが更新された/戻された気配がある
  • ビルド構成(Debug/Release)を切り替えた

このあたりに心当たりがある場合は、.vsとセットで行うのが効果的です。

Visual Studioの修復(Repair)

拡張機能やコンポーネント更新後に、言語サービスやビルドツールチェーンが部分的に壊れることがあります。以下の流れで修復します。

  1. Visual Studio Installerを起動
  2. 対象のVisual Studio(例:2022/2019)の「その他(More)」を開く
  3. Repairを実行

修復は“最終手段”に見えますが、IDE側の一時不具合を一気に解消できるため、原因不明の時ほど価値があります。

NuGet関連の設定とキャッシュ整理(復元漏れを潰す)

「前日まで動いていたのに翌日突然」でも、実はローカルのNuGetキャッシュや復元状態が変わっていることがあります。特に、複数人開発・複数ブランチ・一部だけパッケージ更新…のような環境では、復元の揺れが出やすいです。

やること狙い効果が出やすい症状
NuGet「不足パッケージを自動でダウンロード」系を有効化復元漏れを防ぐ特定の型/参照だけが突然見えない
NuGetキャッシュ(ストレージ)をクリア壊れた/古いキャッシュを捨てるRestoreしても直らない、同じエラーが戻る
ソリューションでRestore参照解決を再構築ビルドだけ失敗、実行環境は残っている

GUIで行う場合は「ソリューションを右クリック → NuGet パッケージの復元」。コマンドで行う場合は環境に応じて以下が使えます。

dotnet restore
dotnet nuget locals all --clear

(.NET Framework主体の古い構成ではnuget.exeを使うこともありますが、まずはVisual StudioのRestoreとキャッシュ整理で十分なことが多いです)

ここまでやっても直らない場合

Aの手順は「環境の不整合」を消します。ここで改善しない場合、次に疑うべきは“コードの意味が別物に解釈されている”、つまりBの名前空間衝突です。

解決策B:名前空間の衝突を避ける(今回の決め手)

結論から言うと、Windows.Applicationのような曖昧になりやすい参照をやめて、完全修飾名(フルネーム)で指定するのが最も堅い解決策です。

最短で直す書き換え例

WPFのApplicationを呼びたい場合は、次のように明示します。

変更前(曖昧)

Windows.Application.Current.Shutdown()

変更後(確定)

System.Windows.Application.Current.Shutdown()

さらにVB.NETでは、プロジェクトのルート名前空間や同名定義の影響を完全に避けたいとき、Globalを付けてグローバル名前空間から辿るのが安全です。

Global.System.Windows.Application.Current.Shutdown()

この書き方にすると、プロジェクト内で偶然SystemやWindowsという名前を使っていても、意図した.NETのSystemへ確実に到達できます。

「なぜ完全修飾名で直るのか」

今回のエラーは、ざっくり言えば次の状態です。

  • あなたの意図:Windows = System.Windows(WPF)
  • コンパイラの解釈:Windows = 別のトップレベル名前空間(例:WinRT/SDK由来のWindows)
  • 結果:そのWindowsの中にApplicationが無いのでエラー

完全修飾名にすると「どのWindowsか」を迷う余地がなくなるため、名前空間衝突の影響が消えます。Aのようなキャッシュ整理で直らない場合でも、Bが“解釈のズレ”を強制的に正すため、決定打になりやすいのです。

別案:Importsを整理して短く書く(ただし慎重に)

コード全体を短く保ちたい場合、次のようにImportsで明示し、以降はApplicationだけで書く方法もあります。

Imports System.Windows

ただし、WinFormsも併用しているプロジェクトではSystem.Windows.Forms.Applicationも存在し、Application単体だと別物に解決されることがあります。混在環境では、完全修飾名のままにするか、次のようにエイリアスで衝突を避けるのがおすすめです。

Imports Wpf = System.Windows
' 以降
Wpf.Application.Current.Shutdown()

衝突元を特定する:原因調査の具体手順

「直ったけど、なぜ昨日まで大丈夫だったのか」を潰しておくと再発防止になります。衝突元の探し方を、Visual Studio上でできる範囲で整理します。

Windowsが何に解決されているかを確認する

  • 「定義へ移動(F12)」:Windowsにカーソルを置いてF12。どの名前空間/アセンブリに飛ぶかを見る
  • クイック情報:ホバーで型/名前空間のフルパスを確認
  • オブジェクトブラウザー:Windowsで検索し、存在するトップレベル名前空間を把握

ここで、意図と違う場所(WinRT/Windows SDK由来のWindows)へ解決されているなら、Bが刺さる理由がはっきりします。

ソリューション内に「Windows」という自作定義がないか検索

衝突は参照ライブラリだけでなく、プロジェクト内の命名でも起きます。以下のキーワードで「ソリューション内検索」をかけてください。

  • Namespace Windows
  • Class Windows / Module Windows
  • Imports Windows
  • Imports System(通常は問題ないが、Imports構成を整理する際の確認用)

もし自作のNamespace WindowsやWindowsというクラス/モジュールが見つかった場合は、可能なら名称変更(例:AppWindowsやUiWindowsなど)を検討してください。プラットフォームや標準ライブラリと同名は、将来の拡張で衝突が起きやすく、今回のように“突然壊れる”地雷になりがちです。

プロジェクトの「インポートされた名前空間」を確認(VB特有の盲点)

VB.NETはプロジェクト設定で、暗黙的に多くの名前空間がインポートされています。ここにトップレベルのWindowsが追加されると、Windows.Applicationの解決先が変わることがあります。

確認の目安(UI名は環境で多少違いますが、概ね以下):

  • プロジェクトのプロパティ
  • 参照(References)関連の画面
  • 「インポートされた名前空間(Imported namespaces)」一覧

不要なものが入っている場合は外すと改善することがあります。ただし、外すことで別の箇所が壊れる場合もあるため、修正範囲が小さい完全修飾名方式(B)のほうが安全に終わるケースが多いです。

参照追加やパッケージ更新の“痕跡”をチェック

「見た目上は環境変更なし」でも、次のような変化が裏で起きていることがあります。

変化の例起きやすい影響確認ポイント
Windows SDK/WinRT系の参照が入ったWindowsがトップレベルとして強く意識される参照一覧、パッケージ一覧、最近のマージ差分
Visual Studio更新で言語サービスが変わった名前解決の優先順位が変わったように見えるVSの更新履歴、拡張機能の更新
ブランチ切替で.vbprojが微妙に変わったインポート/参照が変わるGit差分で.vbprojを確認

WPF/WinForms/.NETの違いで見落としがちな確認点

「WPFのSystem.Windows.Applicationを使っているつもり」でも、プロジェクトの種類やターゲットで前提が変わります。ここがズレると、別のエラーに発展することもあるため、ついでに押さえておきましょう。

.NET(Core/5/6/7/8)でWPFを使う場合の基本

WPFを.NET(.NET 5以降)で使う場合、プロジェクトファイル側でWindows向けターゲットとWPF有効化が必要です(既存プロジェクトなら入っているはずですが、ブランチ差分で抜けることがあります)。

<PropertyGroup>
  <TargetFramework>net8.0-windows</TargetFramework>
  <UseWPF>true</UseWPF>
</PropertyGroup>

この前提が崩れていると、System.Windows.Application自体が見えなくなり、今回とは別の型未定義エラーになります。「完全修飾名にしても直らない」場合は、ここも疑ってください。

WinFormsならSystem.Windows.Forms.Application

WinFormsでアプリ全体を制御したい場合は、WPFではなくWinForms側のApplicationです。混在プロジェクトだと、Applicationという名前が複数あるため、曖昧さが増します。

  • WinForms:System.Windows.Forms.Application
  • WPF:System.Windows.Application
  • VB(My):My.Application

「昨日まで動いた」が通じないのは、曖昧さがあるコードほど“解釈の揺れ”に弱いからです。今回のWindows.Applicationは、まさにそれに当たります。

再発防止:同種の「突然壊れた」を減らす実践ルール

直った後に、同じ手戻りを避けるための運用・コーディングルールをまとめます。どれも大掛かりな仕組みは不要で、日常の小さな選択で効いてきます。

曖昧な名前空間省略をやめる

  • Windows.Applicationのように「前提のImportsに依存する書き方」は避ける
  • 衝突しやすい型名(Application, Window, Message, Dispatcherなど)は、混在環境なら特に完全修飾名を優先
  • VBならGlobal.System...まで使うと、プロジェクト内命名の影響を受けにくい

プロジェクト内で「System」「Windows」などの大物名前を使わない

将来のSDK追加やフレームワーク更新で衝突する確率が上がります。自作名前空間は、組織名や製品名など固有プレフィックスを付けると安全です。

パッケージ復元を“必ず再現できる状態”にする

  • チーム開発なら、パッケージの更新方針(勝手に更新しない/定期更新)を決める
  • CI(ビルドサーバー)でクリーン環境ビルドを回し、「ローカルだけ通る」を減らす
  • .NET SDKを固定したい場合はglobal.jsonの導入も検討(プロジェクト要件次第)

“直し方”をチェックリスト化しておく

この手のトラブルは、次に起きたときに「どこから触るべきか分からない」状態になりがちです。社内WikiやREADMEに、最低限これだけ書いておくと復旧が早くなります。

優先度チェック項目判断基準
高.vs削除、bin/obj削除、RebuildIDE/ビルドが怪しいときの定番
高Windows.ApplicationをSystem.Windows.Applicationへ省略表記だけ死んだときの最短手
中NuGetキャッシュクリア+Restore参照が復元されていない気配がある
中プロジェクトのImported namespaces確認Windowsの解釈が変わった疑い
低Visual Studio Repair他案件でもIDEが不安定、再発が多い

よくある質問

Windows.ApplicationとSystem.Windows.Applicationは同じものですか?

意図としては「SystemがImportsされている前提でWindowsをSystem.Windowsとして使う」ことで同じものを指したい、というケースが多いです。ただし、トップレベルに別のWindows名前空間が見えると解釈が変わるため、結果として同じになりません。確実にWPFのApplicationを指したいなら、System.Windows.Application(必要ならGlobal付き)を推奨します。

なぜ「環境変更なし」なのに翌日突然起きるのですか?

主な理由は次のどれかです。

  • Visual Studioや拡張機能が自動更新され、名前解決やキャッシュの挙動が変わった
  • ブランチ切替やマージで、参照/Importsが微妙に変化していた(気づきにくい)
  • ローカルのキャッシュや復元状態が壊れ、表面上だけコードが悪いように見えた

だからこそ、A(環境リセット)→B(完全修飾名)の順で潰すと、混乱が少なくなります。

.vsを消すと設定が壊れませんか?

基本的に壊れません。.vsはローカルキャッシュで、削除すると再生成されます。ソース管理に入れるべきではない領域です。ただし、個人のブックマークや一部のIDE状態がリセットされることはあるため、気になる場合は「削除」ではなく「リネーム」が安心です。

完全修飾名に直すのが正解なら、最初からそう書くべきですか?

混在環境(WPF/WinForms/WinRT、複数SDK、複数参照が入りやすいプロジェクト)ほど、最初から完全修飾名を推奨します。一方、単純な単独プロジェクトであればImportsで短く書いても運用できます。判断基準は「将来、参照やSDKが増える可能性があるか」「同名型が増えやすいか」です。

書き換えが大量でつらい場合は?

大量発生している場合は、闇雲に手で直す前に以下を検討してください。

  • まずは衝突が発生している箇所を1つ完全修飾名にしてビルドが通るか確認(原因確定)
  • 原因が確定したら、置換(検索/置換)で機械的に直す
  • Importsの整理やエイリアス導入で、変更範囲を小さくできるか検討

それでも直らないときの次の一手は?

System.Windows.Applicationに直しても解決しない場合は、名前解決ではなく参照/ターゲットの問題の可能性が出てきます。WPFならターゲットがnetX.Y-windowsになっているか、UseWPFが有効か、必要な参照が生きているかを確認してください。あわせて、.vbprojの差分(最近の変更)と、NuGetのRestore状態も再チェックすると原因に近づきます。


この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次