Visual Studio 2022のWPFアプリでパフォーマンスを見たいのに、Performance Profilerの「Application Timeline」が「Not applicable tools」に入って選べない――そんな現象はプロジェクト判定が崩れているサインです。原因の探し方と復旧手順をまとめます。
起きていること:同じソリューションのWPFなのに片方だけTimelineが無効
今回の状況を整理すると、同じソリューション内にWPFアプリが2つ(App1・App2)あり、どちらも.NET Framework 4.8でEXEを出力する構成です。ところが、Performance Profiler(診断ツール)を開くと、App2では「Application Timeline」を選べるのに、App1では「Not applicable tools」に分類されて選択できません。
プロジェクトの参照やターゲット、ビルド設定を見比べても明確な差が見えないとき、この手の問題は「Visual Studioがそのプロジェクトを“WPFアプリとして認識できていない”」ことが原因になりがちです。見た目は同じWPFでも、内部判定に使われるメタ情報が欠けていると、ツール側が対象外として弾きます。
Application Timelineとは何か
Application Timelineは、Visual StudioのPerformance Profilerで選べるツールの1つで、アプリの起動から実行中の時間軸に沿って、UIスレッドやイベント処理、フレーム、入力、レイアウト、レンダリングなどの“体感性能に直結する動き”を俯瞰しやすくするための機能です。WPFでは、UIが固まる・スクロールがカクつく・画面遷移が遅いといった症状の原因を「いつ」「どこで」起きたかの観点で追いやすくなります。
逆に言うと、Application Timelineが選べない状態は「プロファイラがそのプロジェクトをWPFの対象として扱えていない」か、「起動の仕方やオプションがツールの前提に合っていない」可能性を示します。
「Not applicable tools」が意味すること
Performance Profilerの画面で「Not applicable tools」に入るのは、ツールが壊れているというより、現在の起動方法・ターゲット・プロジェクト種別では、そのツールを適用できないという判定が出ている状態です。たとえば次のような要因で起きます。
- スタートアッププロジェクトとして起動していない(実行中プロセスにアタッチ、Executable指定など)
- 診断ツール起動時のオプションが競合している(Instrumentationや.NET Object Allocation Trackingなど)
- プロジェクト種別が正しく認識されていない(WPFとして扱われていない)
- 出力タイプやフレームワーク設定がWPFアプリとして成立していない
ポイントは、ツールの表示は「プロジェクトの設定」と「起動の文脈」の両方で決まることです。同じEXEでも、起動経路が違うだけで対象外になることがあります。
最初に確認したい前提条件チェック
App2では動いているのにApp1だけ動かない場合でも、まずは“落とし穴”になりやすい前提を短時間で潰しておくと、無駄な試行錯誤を減らせます。以下は現場で効くチェック項目です。
| チェック項目 | 見る理由 | 確認方法の例 |
|---|---|---|
| Visual Studio 2022を使っているか | Timelineの提供・挙動はVSの世代で差が出る | ヘルプ→バージョン情報 |
| WPFアプリのテンプレートとして認識されているか | プロジェクト種別判定がズレるとツールが対象外になる | プロジェクトの種類、csprojのメタ情報 |
| .NET Framework 4.0以上か(今回は4.8) | 対応対象外のフレームワークだと選べない | プロパティ→ターゲットフレームワーク |
| OutputTypeがEXE(WinExe)になっているか | ライブラリ扱いだとアプリとして起動できず対象外になりやすい | csprojの<OutputType>、またはプロパティ |
| 起動は「Startup Project」からか | Running Process/Executable経由はNot applicableになりやすい | スタートアッププロジェクト設定→F5起動 |
| Instrumentation / .NET Object Allocation Trackingを有効にしていないか | 組み合わせによってTimelineが使えないケースがある | Performance Profiler起動時のチェックを見直す |
この段階で多いのが「App1は実行中プロセスにアタッチしていた」「Executable指定で起動していた」など、起動経路が違っていたケースです。Application Timelineを使うときは、基本的にプロジェクトをスタートアップにしてF5で起動する運用が安全です。
App2は動くのにApp1だけ動かないときの切り分け方
同じソリューションに正常系(App2)があるのは、切り分けにとって最強の材料です。原因は必ずどこかの差分に埋まっています。おすすめは次の順で差分を潰すことです。
- 起動の仕方(Startup Projectか、デバッグ/リリース、x86/x64/AnyCPU)
- プロジェクトの種別(WPFとして認識されているか)
- csprojのメタ情報(ProjectTypeGuidsなど)
- アプリ固有設定(app.manifest、app.config、プロファイル関連)
- Visual Studioのキャッシュ(.vs、コンポーネントキャッシュ、拡張機能)
特にcsprojは「見比べたつもりでも見落としやすい」領域です。WPFのテンプレートから逸脱していると、見た目が似ていてもプロジェクトシステム上の扱いが変わります。
結論:原因はcsproj内のProjectTypeGuidsの欠落・不正
今回のケースで最終的に判明した原因は、App1の.csprojファイル内にある<ProjectTypeGuids>が欠落している、または値が不正だったことでした。App2の.csprojにあるProjectTypeGuidsをApp1へコピーして置き換えたところ、App1でもApplication Timelineが使用可能になりました。
ProjectTypeGuidsが効いてしまう理由
従来形式(非SDK形式)の.csprojでは、Visual Studioは<ProjectTypeGuids>を含むメタ情報から「これはC#のWPFアプリ」「これはクラスライブラリ」「これは別の拡張テンプレート」などを判定します。ここが壊れていると、Visual Studio内部ではApp1がWPFとしての機能セットを持たないプロジェクトとして扱われ、WPF向けのツール(Application Timelineなど)が対象外になり得ます。
一方、SDK形式(Microsoft.NET.Sdk.WindowsDesktopなど)のプロジェクトでは、UseWPFなど別の仕組みで判定されることが多く、そもそもProjectTypeGuidsが存在しないこともあります。まず自分のプロジェクトがどちらの形式かを把握し、今回の手当てが有効なタイプか確認してください。
迷ったら、.csprojの先頭を見て形式を判定できます。
| 形式 | csprojの見分け方(代表例) | WPF判定のキーになりやすい項目 |
|---|---|---|
| 従来形式(非SDK) | <Project ToolsVersion=”…”> で始まり、ImportでMicrosoft.CSharp.targets等を読み込む | <ProjectTypeGuids>、<OutputType>、<TargetFrameworkVersion> |
| SDK形式 | <Project Sdk=”Microsoft.NET.Sdk.WindowsDesktop”> 等で始まる | <UseWPF>true</UseWPF>、<TargetFramework>net48</TargetFramework> |
今回の「ProjectTypeGuidsをコピーして直る」パターンは、主に従来形式(非SDK)で起きやすいトラブルです。SDK形式でTimelineが出ない場合は、まずUseWPFや起動方法、診断オプション側の条件を疑うのが近道です。
解決手順:正しいProjectTypeGuidsを復元する
最短で直す方法は「動いているWPFプロジェクトの値をコピーする」ことです。GUIDの正解を外から探すより、同一環境・同一ソリューションで動いているApp2が正解データになります。
手順の全体像
- 正常なWPFプロジェクト(App2、または新規作成した空のWPF)を用意する
- 正常側の.csprojを開き、<ProjectTypeGuids>要素を探す
- その要素を丸ごとコピーする
- App1の.csprojを開き、<ProjectTypeGuids>が無ければ追加、あれば置き換える
- 保存→Rebuild→必要ならVisual Studio再起動
- App1をスタートアッププロジェクトにしてPerformance Profilerを開き、Application Timelineが出るか確認
csprojの編集例(表示用)
実際のGUIDはプロジェクト形式やテンプレートで変わる可能性があるため、必ずApp2(または新規WPF)からコピーしてください。配置イメージは次のようになります。
<PropertyGroup>
<ProjectTypeGuids>(ここにApp2からコピーした値)</ProjectTypeGuids>
</PropertyGroup>
参考として、従来形式の「C# + WPFアプリ」では次のようなGUIDの組み合わせになることが多いです(環境やテンプレートで追加のGUIDが入る場合もあるため、最終的にはApp2や新規作成したWPFプロジェクトの値を優先してください)。
<ProjectTypeGuids>{60DC8134-EBA5-43B8-BCC9-BB4BC16C2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
反映されないときの追加アクション
csprojを直しても表示が変わらないときは、Visual Studioが古い判定をキャッシュしていることがあります。次を順に試すと改善することがあります。
- ソリューションを閉じてVisual Studioを再起動する
- App1を右クリック→「プロジェクトの再読み込み」(一度アンロードしてから)
- bin/objフォルダを削除してからRebuildする
- ソリューション直下の「.vs」フォルダを削除してから開き直す(閉じた状態で)
「なぜ無効なのか」を知る方法はあるのか
結論から言うと、Performance ProfilerのUI上で「なぜNot applicableなのか」を理由付きで表示してくれる仕組みは基本的にありません。実務では、差分比較と最小再現で原因を詰めるのが近道です。
実務で効く調査アプローチ
| アプローチ | 狙い | やり方 |
|---|---|---|
| csproj/app.manifest/app.configの差分比較 | プロジェクト種別・起動条件・権限などの違いを炙り出す | ファイルを並べて比較、またはdiffツールを使う |
| 新規WPFを作って設定を段階的に移植 | どの変更で壊れたかを特定する | 参照や設定を少しずつ追加して都度確認する |
| MSBuildのビルドログ(binlog)を取る | プロパティの最終値やインポート差分を可視化する | msbuild /bl でbinlogを生成し、Viewerで確認する |
| Visual StudioのActivityLog.xmlを確認 | 拡張機能やプロジェクトシステムのエラーの手掛かりを探す | devenv /log で起動してログを採取する |
特に「App2ではOK」「App1だけNG」という状況では、アプリのコードそのものより、プロジェクトシステムが持つメタ情報に原因がある確率が高いです。今回のProjectTypeGuidsのように、気づきにくい1行が決定打になることも珍しくありません。
よくある落とし穴と追加チェックポイント
ProjectTypeGuids以外にも、Application Timelineが出ない/出たり出なかったりするケースがあります。現場で遭遇しやすいものをまとめます。
| 症状 | 疑うポイント | 対処の方向性 |
|---|---|---|
| Running ProcessやExecutableからは出ない | 起動経路が対象外 | スタートアッププロジェクトとしてF5起動に統一する |
| 特定のオプションをONにするとTimelineが消える | ツール間の競合 | Instrumentation / .NET Object Allocation Trackingを外して試す |
| App1だけプロジェクトアイコンやデザイナ挙動が違う | プロジェクト種別の誤認識 | ProjectTypeGuidsやテンプレート由来の設定を見直す |
| 設定を直したのに表示が変わらない | キャッシュが残っている | .vs削除、再読み込み、Rebuild、VS再起動を試す |
| デバッグ構成では出るがリリース構成では出ない | 最適化やシンボル、ビルド差分 | まずDebugで再現確認し、構成差分を縮めていく |
再発防止の考え方:csprojの“整合性”を守る
ProjectTypeGuidsが欠落する場面は、手作業で.csprojを編集したときだけではありません。たとえば次のようなタイミングで起きがちです。
- 古いVisual Studioのプロジェクトを新しい環境へ移行した
- Gitのコンフリクト解消で.csprojの一部を誤って削除した
- 別テンプレートの.csprojを流用してプロジェクトを手作りした
- 一部だけSDK形式へ変換した/逆変換した
再発防止としては、「動く状態のWPFプロジェクトを雛形として維持する」「プロジェクトファイルは差分レビューを徹底する」「ツールが効かなくなったらまず起動経路とプロジェクト種別を疑う」といった運用が効きます。アプリのコードよりも、プロジェクトメタ情報の破損の方が“静かに”問題を引き起こすからです。
現場向けチェックリスト
Application Timelineが「Not applicable tools」になったら、次の順で確認すると効率的です。
| 優先度 | チェック内容 | メモ |
|---|---|---|
| 高 | スタートアッププロジェクトとして起動しているか | Running Process/Executableは避ける |
| 高 | Instrumentation / .NET Object Allocation Trackingを外して試したか | 競合でTimelineが消えることがある |
| 高 | csprojの<ProjectTypeGuids>が正しいか | App2や新規WPFからコピーが確実 |
| 中 | OutputType(WinExe)やターゲット(.NET Framework 4.8)を再確認 | WPFアプリとして成立しているか |
| 中 | キャッシュ削除や再読み込みを実施したか | .vs、bin/obj、VS再起動 |
今回の事例では、最終的にProjectTypeGuidsの修正が決定打となり、App1でもApplication Timelineが正常に選べるようになりました。App2が動いているなら、同じ値をコピーして“Visual StudioがWPFと認識できる状態”に戻すのが最短ルートです。

コメント