Windows アプリの開発手段の選択肢をまとめてみた

# はじめに

Windows アプリの開発手段は幾つもあります。新たにアプリを作るときにどれを選ぶのがいいのか、
知りたくて幾つか記事を読んでみました。例えば、

* [新規開発ソフトのWindowsForms、WPF、UWPの選択について｜teratail]
(https://teratail.com/questions/77077)

* [Windowsデスクトップ向け業務アプリ開発には何を採用すべきか？ - Qiita]
(https://qiita.com/sengoku/items/fb4948e0d2746e3cc26f)

これまで使ったことのないコンセプトも出てきてよく分からないし、新たに聞く用語もあるので調べてみるがさらに分からなくなります。
記事を読んでいて混乱する理由は、記事で同列に並べられているコンセプトが、実は異なるレイヤーのもののようだと分かってきました。
そこで、用語とコンセプトを整理してみました。勘違いしているところもあるかも知れませんが。

# Windows アプリの種類と概要

<table>
  <tr>
    <td>アプリケーションの種類</td>
    <td colspan=2>UWP アプリ</td><td colspan=6>デスクトップアプリ</td>
  </tr>
  <tr>
    <td>配布方式</td>
    <td colspan=3>主に Microsoft Store 経由</td><td colspan=5>直接ダウンロード可能</td>
  </tr>
  <tr>
    <td>パッケージ形式</td>
    <td colspan=3>APPX</td><td colspan=5>MSI または独自インストーラ</td>
  </tr>
  <tr>
    <td>開発ツール</td>
    <td>Visual Studio</td><td>VS など</td><td>右のいずれか</td><td>VS</td><td>VS</td><td>VB6</td><td>VC++ など</td><td>VC++ など</td>
  </tr>
  <tr>
    <td>UI フレームワーク</td>
    <td>XAML</td><td>HTML</td><td>右のいずれか</td><td>XAML</td><td>WinForms</td><td>独自</td><td>MFC など</td><td>なし</td>
  </tr>
  <tr>
    <td>開発言語</td>
    <td>C# など</td><td>JavaScript</td><td>右のいずれか</td><td>C# など</td><td>C# など</td><td>VB</td><td>C++ など</td><td>C++ など</td>
  </tr>
  <tr>
    <td>UI サブシステム</td>
    <td colspan=2>WinUI</td><td>右のいずれか</td><td>WPF</td><td>WinForms</td><td>VB ランタイム</td><td colspan=2>×</td>
  </tr>
  <tr>
    <td rowspan=2>API</td>
    <td rowspan=2 colspan=2>WinRT</td><td>右のいずれか</td><td colspan=2>.NET Framework</td><td>VB ランタイム</td><td colspan=2>×</td>
  </tr>
  <tr>
    <td>右のいずれか</td><td colspan=5>Win32/64</td>
  </tr>
  <tr>
    <td rowspan=2>実行環境</td>
    <td colspan=8>Win 10</td>
  </tr>
  <tr>
    <td colspan=3>×</td><td colspan=5>Win 7 以前</td>
  </tr>
</table>

* Windows API とは、Microsoft Windows のシステムコール用 API のこと。特に Windows 95 以降や Windows NT で利用できるものは Win32 API と呼ばれる。
([Windows API - Wikipedia](https://ja.wikipedia.org/wiki/Windows_API))

* .NET Framework は、実行中のアプリにさまざまなサービスを提供する、Windows 向けのマネージド実行環境です。 
実行中のアプリを処理する実行エンジンである共通言語ランタイム (CLR) と、開発者が独自のアプリから呼び出すことができる検証済みの再利用可能なコード ライブラリである .NET Framework クラス ライブラリから構成されています。
([.NET Framework の概要 | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/framework/get-started/))

* WinForms（Windows Forms）は、.NET Framework に含まれるグラフィカルユーザーインターフェイス API である。Windows API（GDI/GDI+）をマネージコードでラップし、Windows のユーザーインターフェイス要素へのアクセスを提供するフレームワークである。
従来から Visual C++ 用に提供されていた、複雑なネイティブ C++ ベースの MFC や、旧 Visual Basic（VB6）のフォームにとって代わるものとされる。
([Windows Forms - Wikipedia](https://ja.wikipedia.org/wiki/Windows_Forms))

* WPF（Windows Presentation Foundation）は、.NET Framework 3.0 以降に含まれるユーザインタフェースサブシステムである。
([Windows Presentation Foundation - Wikipedia](https://ja.wikipedia.org/wiki/Windows_Presentation_Foundation))
WPF は、Extensible Application Markup Language (XAML) を使用して、アプリケーションのプログラミング用に、宣言型モデルを提供します。
([WPF とは - Visual Studio | Microsoft Docs](https://docs.microsoft.com/ja-jp/visualstudio/designers/getting-started-with-wpf))

* UWP（Universal Windows Platform）とは、Windows 10 のコアだと言える。そこにデバイスごとの機能を追加したものが、デバイスに応じた Windows 10 の各製品である。
UWPアプリの開発には、主に C#/VB.NET/C++ 言語と XAML 、もしくは JavaScript 言語と HTML を用いる。
ベースとなるフレームワークは Windowsランタイム (WinRT) だが、デバイスに応じてWindows API や DirectX 、そして .NET Framework を用いることも可能である。
([UWP（ユニバーサルWindowsプラットフォーム)とは？ UWPアプリ開発の特徴 - Build Insider](https://www.buildinsider.net/enterprise/uwpapp/01))

* WinRT（Windows Runtime）とは、Modern UI スタイルのアプリケーションを作成するバックボーンとなるAPIである。
Windows 8 以降のオペレーティングシステムで実装されている。
ネイティブ言語である C++/CX（C++ Component Extensions）、マネージ言語である C# および VB.NET 、そしてスクリプト言語である JavaScript および TypeScript による開発に対応する。
([Windowsランタイム - Wikipedia](https://ja.wikipedia.org/wiki/Windows%E3%83%A9%E3%83%B3%E3%82%BF%E3%82%A4%E3%83%A0))

* WinUI（Windows UI Library）は、モダンな Windows アプリ（UWP/XAML）を構築するためのコントロールとスタイルを含んだユーザーインターフェイスレイヤー。
最新バージョンの Windows 10 でしか利用できないコントロールを以前のバージョンの Windows 10 でも利用できるよう後方互換性を提供するほか、XAML に低レベル API へのアクセスを提供する XamlDirect でミドルウェア開発者のライブラリ開発を支援する。
([UWPアプリの洗練されたUIをWin32アプリでも ～Microsoft、「WinUI 3」を発表](https://forest.watch.impress.co.jp/docs/news/1255558.html))

* XAML（Extensible Application Markup Language）とは、Microsoft によって開発された、アプリケーションソフトのユーザーインターフェースを記述するための言語仕様のことである。
XAML は XML をベースとしたマークアップ言語であり、例えば HTML が Web ページの構造を定義するように、アプリケーションの外観やボタン配置などを設定することができる
([XAMLとは何？ Weblio辞書](https://www.weblio.jp/content/XAML))

* デスクトップブリッジとは、従来のデスクトップアプリ（.NET Framework のものとは限りません）を「UWP アプリ化」する技術です。
「UWP アプリ化」によって、まず、アプリの配布方法が UWP アプリと同じになります。一般向けの Microsoft Store などで公開したり、購入したデジタル証明書を使って署名したパッケージを配布したりできます。
「UWP アプリ化」したアプリには、UWP のパッケージ ID が与えられます。これによって、従来のデスクトップアプリからは利用できなかった UWP の API の一部が、利用できるようになります。
「UWP アプリ化」したアプリは、UWP のサンドボックスに制限されません。
([簡単になったUWP Bridge：CodeZine（コードジン）](https://codezine.jp/article/detail/10810))

# Windows アプリの開発手段の選択肢

* 「Win 32 API」アプリ

<table>
  <tr>
    <td>アプリケーションの種類</td>
    <td colspan=2>デスクトップアプリ</td>
  </tr>
  <tr>
    <td>開発ツール</td>
    <td>VC++ など</td><td>VC++ など</td>
  </tr>
  <tr>
    <td>UI フレームワーク</td>
    <td>MFC など</td><td>なし</td>
  </tr>
  <tr>
    <td>開発言語</td>
    <td>C++ など</td><td>C++ など</td>
  </tr>
  <tr>
    <td>UI サブシステム</td>
    <td colspan=2><b>×</b></td>
  </tr>
  <tr>
    <td rowspan=2>API</td>
    <td colspan=2><b>×</b></td>
  </tr>
  <tr>
    <td colspan=2><b>Win32/64</b></td>
  </tr>
  <tr>
    <td rowspan=2>実行環境</td>
    <td colspan=2>Win 10</td>
  </tr>
  <tr>
    <td colspan=2>Win 7 以前</td>
  </tr>
</table>

* 「WinForms」アプリ

<table>
  <tr>
    <td>アプリケーションの種類</td>
    <td>デスクトップアプリ</td>
  </tr>
  <tr>
    <td>開発ツール</td>
    <td>Visual Studio</td>
  </tr>
  <tr>
    <td>UI フレームワーク</td>
    <td>WinForms</td>
  </tr>
  <tr>
    <td>開発言語</td>
    <td>C# など</td>
  </tr>
  <tr>
    <td>UI サブシステム</td>
    <td><b>WinForms</b></td>
  </tr>
  <tr>
    <td rowspan=2>API</td>
    <td>.NET Framework</td>
  </tr>
  <tr>
    <td>Win32/64</td>
  </tr>
  <tr>
    <td rowspan=2>実行環境</td>
    <td>Win 10</td>
  </tr>
  <tr>
    <td>Win 7 以前</td>
  </tr>
</table>

* 「WPF」アプリ

<table>
  <tr>
    <td>アプリケーションの種類</td>
    <td>デスクトップアプリ</td>
  </tr>
  <tr>
    <td>開発ツール</td>
    <td>Visual Studio</td>
  </tr>
  <tr>
    <td>UI フレームワーク</td>
    <td>XAML</td>
  </tr>
  <tr>
    <td>開発言語</td>
    <td>C# など</td>
  </tr>
  <tr>
    <td>UI サブシステム</td>
    <td><b>WPF</b></td>
  </tr>
  <tr>
    <td rowspan=2>API</td>
    <td>.NET Framework</td>
  </tr>
  <tr>
    <td>Win32/64</td>
  </tr>
  <tr>
    <td rowspan=2>実行環境</td>
    <td>Win 10</td>
  </tr>
  <tr>
    <td>Win 7 以前</td>
  </tr>
</table>

* 「UWP」アプリ

<table>
  <tr>
    <td>アプリケーションの種類</td>
    <td colspan=2>UWP アプリ</td>
  </tr>
  <tr>
    <td>配布方式</td>
    <td colspan=2>主に Microsoft Store 経由</td>
  </tr>
  <tr>
    <td>パッケージ形式</td>
    <td colspan=2>APPX</td>
  </tr>
  <tr>
    <td>開発ツール</td>
    <td>Visual Studio</td><td>VS など</td>
  </tr>
  <tr>
    <td>UI フレームワーク</td>
    <td>XAML</td><td>HTML</td>
  </tr>
  <tr>
    <td>開発言語</td>
    <td>C# など</td><td>JavaScript</td>
  </tr>
  <tr>
    <td>UI サブシステム</td>
    <td colspan=2>WinUI</td>
  </tr>
  <tr>
    <td rowspan=2>API</td>
    <td colspan=2><b>WinRT</b></td>
  </tr>
  <tr>
  </tr>
  <tr>
    <td rowspan=2>実行環境</td>
    <td colspan=2><b>Win 10</b></td>
  </tr>
  <tr>
    <td colspan=2>×</td>
  </tr>
</table>

* 「Xamarin」アプリ

Xamarin を使って、どのタイプの Windows アプリを開発できるのか、分かりません。

* 「Electron」アプリ

Electron を使って、上記の「Win 32 API」アプリが作れると思われます。

<table>
  <tr>
    <td>アプリケーションの種類</td>
    <td>デスクトップアプリ</td>
  </tr>
  <tr>
    <td>開発ツール</td>
    <td>VS など</td>
  </tr>
  <tr>
    <td>UI フレームワーク</td>
    <td>HTML</td>
  </tr>
  <tr>
    <td>開発言語</td>
    <td>JavaScript</td>
  </tr>
  <tr>
    <td>UI サブシステム</td>
    <td>×</td>
  </tr>
  <tr>
    <td rowspan=2>API</td>
    <td colspan=2>×</td>
  </tr>
  <tr>
    <td colspan=2>Win32/64</td>
  </tr>
  <tr>
    <td rowspan=2>実行環境</td>
    <td colspan=2>Win 10</td>
  </tr>
  <tr>
    <td colspan=2>Win 7 以前</td>
  </tr>
</table>

* 「Delphi」アプリ

Delphi を使うと、「Win 32 API」アプリも「UWP アプリ」も作れると思われます。

<table>
  <tr>
    <td>アプリケーションの種類</td>
    <td>UWP アプリ</td><td>デスクトップアプリ</td>
  </tr>
  <tr>
    <td>開発ツール</td>
    <td colspan=2>Delphi</td>
  </tr>
  <tr>
    <td>UI フレームワーク</td>
    <td>FireMonkey</td><td>VCL</td>
  </tr>
  <tr>
    <td>開発言語</td>
    <td colspan=2>Delphi 言語（Object Pascal）</td>
  </tr>
  <tr>
    <td>UI サブシステム</td>
    <td>WinUI</td><td>×</td>
  </tr>
  <tr>
    <td rowspan=2>API</td>
    <td rowspan=2>WinRT</td><td>×</td>
  </tr>
  <tr>
    <td colspan=2>Win32/64</td>
  </tr>
  <tr>
    <td rowspan=2>実行環境</td>
    <td colspan=2>Win 10</td>
  </tr>
  <tr>
    <td>×</td><td>Win 7 以前</td>
  </tr>
</table>