Windowsシングルバイナリ化の限界と実践

· · Windows, 配布, シングルバイナリ, .NET, C++, WebView2, WinUI

まず結論

Windows で「シングルバイナリにしたい」には、実は次の4つの意味が混ざっています:

  • 配布物を1個にしたい
  • .NET や VC++ ランタイムの事前インストールを不要にしたい
  • インストーラや管理者権限なしで置くだけで動かしたい
  • 対象 Windows の違いに依存したくない

配布物を 1 EXE に寄せることはかなりできる。でも、対象 Windows への依存をゼロにすることはできない。これが実務的な境界線です。

「シングルバイナリ」の4段階

レベルA: 配布物が1個

見た目の配布単位の話。実際には起動時に一時展開していても、OS の DLL に依存していても満たせる。

レベルB: 言語ランタイムの事前インストール不要

  • C/C++ の静的リンク
  • .NET の self-contained / single-file / Native AOT

このレベルになると「単体で持っていける」感じが強くなる。

レベルC: インストールや登録が不要

ここから急に難しくなる。Shell 拡張、Windows サービス、ドライバ、COM 登録は「置くだけ」では済まない。

レベルD: 対象 Windows に依存しない

Windows では無理。アプリは最終的に Windows の API、ローダー、セキュリティモデルの上で動くから。

1 EXE にしやすい領域

次のようなアプリは 1 EXE に寄せやすい:

  • 単独起動のデスクトップツール
  • EXE 自身が UI と処理を持つ業務アプリ
  • 通信、ファイル処理、ログ収集、監視、装置制御ツール
  • Explorer や Office のホスト統合を必要としないもの

実務では app.exe 1個、または app.exe + 隣接 DLL 数個で xcopy 配布できる形のほうが、無理に 1 EXE に圧縮するより保守しやすいことも多いです。

1 EXE でも消えない Windows 依存

  • OS バージョン依存: API の最低サポート OS、x64/Arm64 の違い
  • システム DLL 依存: kernel32.dll, user32.dll などは OS 側の責任範囲
  • セキュリティモデル依存: UAC、ファイル ACL、サービス制御マネージャなど
  • ホストやランタイム依存: WebView2 Runtime、Windows App SDK など

技術別の現実的な落としどころ

技術 現実度 注意点
ネイティブ C/C++ 高い 静的リンク可能、UCRT の扱いに注意
.NET (single-file) 高い 配布物のまとまりは良くなるが OS 依存は変わらない
.NET (Native AOT) 高い 起動時依存は減るが機能制約あり
WebView2 低〜中 Runtime 配布方式が本題。EXE の数より Runtime の扱い
WinUI 3 UI 技術の選択がそのまま配布方式の選択になる

本質的に「登録・依存」が必要な領域

  • Shell 拡張: Explorer への登録が必要。置くだけでは動かない
  • Windows サービス: SCM への登録、権限、起動アカウントの設計が必要
  • ドライバ: INF、署名、インストール手順まで含めて成立。single binary の土俵に乗りにくい

実務での判断表

作りたいもの 1 EXE 現実度 先に考えるべきこと
単独起動 Win32/C++ ツール 高い 静的リンク、対象 OS/arch
WinForms/WPF ツール 高い self-contained、single-file、Native AOT
WinUI 3 アプリ 配布モード、追加依存
WebView2 デスクトップ UI 低〜中 Runtime 配布方式
Shell 拡張 低い COM/レジストリ登録
Windows サービス SCM 登録、権限、更新手順
ドライバ同梱アプリ 低い INF、署名、インストール

配布設計で先に決めるべきこと

  1. 何を1個にしたいのかを決める - 配布物か、ランタイム不要化か、インストーラ不要化か
  2. 最低サポート Windows と arch を最初に固定する - 曖昧なまま進めると最後に詰まる
  3. 「同梱するもの」と「Windows に任せるもの」を明文化する
  4. single binary を優先するなら、ホスト統合を減らす - Shell 拡張やサービス化を避けるほど近づく

まとめ

  • アプリを 1 EXE にすることはできるが、依存する Windows まで 1 EXE にすることはできない
  • 単独起動の普通の EXE なら、かなり 1ファイル配布へ寄せられる
  • OS バージョン、arch、システム DLL、セキュリティモデルへの依存は消えない
  • Shell 拡張、サービス、ドライバ、WebView2、WinUI 3 は OS 登録や追加ランタイムが本題
  • single binary を強く優先するなら、技術選定の時点で OS との結合度を下げる方向で設計する

参考資料

関連する記事

同じタグを共有する最新の記事です。さらに近い話題で知識を深められます。

ClickOnce 入門:配布・更新・選定基準

ClickOnce の仕組みと向き不向きを実務目線で整理します。マニフェスト、自動更新、キャッシュ分離、署名、配布経路の注意点に加え、社内業務アプリで強い理由と MSI/MSIX が適するケースの見分け方が分かります。

記事を読む

IEモード依存システムの脱却ガイド

Microsoft Edge の IE モード依存をかかえた社内 Web システムを安全に延命しつつ脱却する実務手順を、サイトリスト集中管理、ニュートラルサイト、WebView2 ラッパー、段階的リファクタリング、VDI 隔離、ガバナンス設計まで読者がそのまま着手できる粒度...

記事を読む

関連トピック

このテーマと近いトピックページです。記事を起点に、関連するサービスや他の記事へ進めます。

このテーマがつながるサービス

この記事は次のサービスページにつながります。近い入口からご覧ください。

ブログ一覧に戻る