ストアの落とし穴 #1:アプリの依存関係がゴーストスタートメニュー項目をインストールした
2026-05-28
タグ:Windows · MSIX · Microsoft Store · ストアの落とし穴
Windows アプリを Microsoft Store に公開するのは、いつも順調とは限りません。このシリーズでは、私が実際に遭遇した落とし穴を記録します——1 記事につき 1 つ、短く実用的に。
これが第 1 弾です。
背景
RDP Heartbeat は元々 Python + Tkinter で作られたツールでした——RDP セッションが生きているかを教えてくれる、画面の隅にある小さな呼吸ドットです。動いてはいましたが、Python デスクトップアプリを Microsoft Store 用にパッケージングするのは一苦労でした:Python ソース → PyInstaller exe → Inno Setup インストーラー → MSIX パッケージ。その全過程について記事を書きました。
そこで、ネイティブ WinUI 3 と Windows App SDK 2.0.1 で一から書き直しました。ネイティブの道なら順調なはず——もう Python パッケージングの悪戦苦闘は不要です。実際そうでした、Store の認証に提出するまでは。
「合格、ただし修正が必要」
認証結果が戻ってきました:
Status: Pass with required fix
10.1.1.11 On Device Tiles: Your submission installs multiple components to the device. Please make sure the additional installed components that are visible in the Start Menu have a unique name that clearly identifies which item is the main product.
合格——しかし警告付き。スタートメニューに何か余分なものが表示されていて、それは私のアプリではありませんでした。
ゴースト項目
認証レポートには、スタートメニューに何か余分なものが表示されたとありました。確認してみると——正直なところ、特に異常はありませんでした。スタートメニューは期待通りで、余分なタイルはありませんでした。
プロジェクト全体を見直しました:パッケージマニフェストを確認し、ビルド出力を調べ、他の Store アプリと比較しました。余分なパッケージも、怪しい拡張機能も、目立つものは何もありませんでした。
でも一つ違いがありました。他のアプリ——EnvStudio、GhostWin、QuickGUID——はすべて Windows App SDK 1.8.x を使っていました。RDP Heartbeat だけが SDK 2.0.1 を使っています。これが唯一の変更点でした。
WinUI 3 アプリは Windows App SDK ランタイムに依存しており、これは共有システム依存関係としてインストールされる MSIX パッケージとして配布されます。私が指摘できる唯一の容疑者は SDK 2.x ランタイムです——なぜか、Microsoft のテスト環境では(私のマシンではありません)、そのデプロイメントが可視のスタートメニュータイルを生成しました。正確な理由はわかりません。
どうすればいいのか?
一番イライラする点はこれです:直接修正することはできません。ランタイムパッケージは Microsoft が作成したものです——スタートメニューでの表示方法を制御することはできません。
現実的な選択肢:
- 受け入れて説明を書く——Store 申告の備考に、余分なタイルは Microsoft 提供のランタイム依存関係であり、別製品ではないと説明を追加します。私がやったのはこれで、認証は通りました。
- 自己完結型デプロイメントに切り替える——
.csprojで<WindowsAppSDKSelfContained>true</WindowsAppSDKSelfContained>を設定し、ランタイムをアプリパッケージに直接バンドルします。これで DEPN は完全に消除されますが、アーキテクチャごとに約 40 MB ダウンロードサイズが増加します。
まとめ
Windows App SDK 2.x で Microsoft Store 向けアプリを開発している場合:
- ランタイム依存関係が可視のスタートメニュータイルを作成する可能性があることに注意
- これは 2.x ランタイムの副作用であり、アプリのバグではありません
- 申告備考に明記して、認証の遅延を防ぐ
- ゴースト項目が許容できないなら、自己完結型デプロイメントが最もクリーンな回避策
「ストアの落とし穴」シリーズの一部。