.NET 7 時代の Windows アプリ開発事情

.NET Conf 2022 Recap 福岡

Tatsuro Shibamura @shibayan

私について

芝村 達郎 @shibayan

Windows アプリ開発してますか?🤔

Windows の機能は進化し続けている

  • タイトルバーのカスタマイズ / ダークモード
  • ウィンドウのスナップ
  • プッシュ通知
  • モダンな Web 技術に対応した WebView
  • パワーマネジメント

Windows アプリを作る方法は多い

  • Win32 API / MFC (C++)
  • .NET Framework (C#)
  • React Native (Node.js)
  • Electron (Node.js)
  • Flutter Windows (Dart)

Windows アプリの作りやすさは C# が一番

🎉当然ながら親和性が一番高い🎉

.NET 7 での重要なキーワード

  • Unified (Target Framework Moniker)
  • .NET MAUI
  • Native AOT
  • ARM64 (Windows on ARM 含む)

最新の Windows アプリに必要な要素

  • モダンなウィンドウ、ダイアログ、UI コントロール、機能
    • WinUI と WinRT が担う領域
  • 最新仕様に対応した WebView
    • Chromium Edge ベースの WebView2
  • ランタイム同梱のシングルファイルアプリケーション
    • Self-contained App / Native AOT

Windows on ARM (ARM64) の存在

  • モバイル分野では ARM64 への対応が無視できなくなる時代が来る、かも
    • 低消費電力、常時接続という特徴は大きい
  • 意外に業務アプリでの需要が多くなる可能性
    • Surface Pro 9 5G が ARM64 搭載
    • 今後は主流になる可能性が無いとも言えない…

.NET 7 と Windows の機能を活用しないと
デスクトップアプリの価値が減る

ネイティブ機能を使わない場合は Web アプリで良い😢

.NET を使った Windows アプリ開発の方法

  • P/Invoke (Win32 API / COM)
  • Windows Forms
  • Windows Presentation Foundation
  • Universal Windows Platform
    • WinUI 2
  • Windows App SDK
    • WinUI 3
  • .NET Multi-Platform App UI
    • WinUI 3

😇 アプリ開発の方法が多すぎる 😇

順を追って説明していきます

P/Invoke (Win32 API / COM)

P/Invoke (Win32 API / COM) の個人的見解

  • Win32 API / COM の知識がある場合には自由度が高い
  • 他の SDK を使って開発している際にネイティブ機能を +α 出来る
    • 新しい機能を素早く利用できる
  • 基本は Win32 API / COM なので知っていて損はない
    • 特に CsWin32 はネイティブ相互運用コードを楽に書ける

Windows Forms

  • デザイナーを使って Windows アプリの開発が可能
    • .NET Framework 1.0 から利用可能
  • アクセシビリティ改善や HiDPI サポートなど、継続的なアップデート
    • PerMonitor V2 の対応 / CsWin32 への移行などが予定されていて積極的
  • What's new in Windows Forms in .NET 7.0 - .NET Blog

Windows Forms の個人的見解

  • モダンな UI が必要ない、業務アプリなどでは必要十分
    • デザイナーを使って素早くアプリを作れる
  • .NET Framework で作られている場合は .NET 7 に移行する価値あり
  • Native AOT へのサポートが比較的進んでいる(COM 周り)
    • 最初に対応される可能性が高そう

Windows Presentation Foundation

  • XAML を使った宣言的な UI 定義が可能で 10 年以上の実績あり
    • Visual Studio は WPF ベース (但し .NET Framework)
  • パフォーマンスやアクセシビリティの改善が行われている
    • WPF は仕組み上パフォーマンスが悪くなりがち
    • 特にコミュニティベースでの改善が多い
  • What's new for WPF in .NET 7 - .NET Blog

Windows Presentation Foundation の個人的見解

  • 若干ながら将来性に不安がある
    • Windows 11 の新しいテーマへの対応が行われていない
    • ダークモード対応もまだ
  • Native AOT への対応はかなり厳しそう
    • WPF はリフレクションが多用されているため
  • XAML と Win32 API の知見があれば一番楽に書けるはず

Universal Windows Platform

Universal Windows Platform の個人的見解

  • 早急に Windows App SDK への移行を行う方が良い
    • Windows App SDK への移行は比較的容易
    • Upgrade Assistant を使った支援が利用可能
  • 名前にある Universal 要素は既に失われている
    • Windows App SDK からも UWP テンプレートは削除予定

Windows App SDK

  • 最新の Windows 機能に対応したアプリを作成可能な SDK
    • OS とは切り離されたリリースサイクルを持つ
    • WinUI 3 によるモダンな UI が利用可能
  • 実体は WinRT を C++ / C# から利用するために一部をラップし直したもの
    • SDK は C++ 実装 + C# への言語プロジェクション
  • Windows 11 の最新機能へのサポートあり
    • Widgets や Acrylic / Mica といったエフェクトに対応

Windows App SDK の個人的見解

少しだけディープな話

Windows アプリのウィンドウは実質 3 種類ある

  • Win32 API ベースのウィンドウ (CreateWindowEx)
    • Windows Forms / WPF など全ての基礎に
  • WinRT ベースのウィンドウ (CoreWindow / AppWindow)
    • UWP / Windows App SDK / .NET MAUI
  • WinUI ベースのウィンドウ (Window)
    • Windows App SDK / .NET MAUI (内部的に)

.NET Multi-platform App UI

  • 元々は Xamarin.Forms だったが、Windows アプリも作成可能
    • WinUI 3 が利用されているので、UI は Windows App SDK に近い
    • 実際に Windows App SDK が使われている
  • .NET でクロスプラットフォームのアプリを実装する際にはほぼ一択
    • iOS / Android / Windows / macOS などに対応

.NET Multi-platform App UI の個人的見解

  • Windows App SDK で直接書くよりもサポートが充実しているのでは…?
    • Xamarin.Forms で培われたライブラリ・ノウハウが利用出来る
  • 実は一番の有力株なのでは…

.NET 7 時代はどれを選ぶのが正解?🤔

決定版は未だ出ていないと言える

  • Windows 固有や新機能への対応
    • Windows App SDK / Win32 API
  • Native AOT への対応
    • Windows Forms (実験) / Windows App SDK (予定) / Win32 API (COM は大変)
  • WinUI によるモダンな UI
    • UWP / Windows App SDK / .NET MAUI
  • 開発のしやすさ、機能の多さ、安定感
    • Windows Forms / Windows Presentation Foundation

現実的な選択肢は何?

  • 完全に新規で Windows アプリケーションを開発する
    • ➡️ 将来性に期待しつつ Windows App SDK を使う
    • ➡️ WPF + CsWin32 で無難に行く
  • クロスプラットフォーム対応を検討している
    • ➡️ .NET MAUI の一択
  • 既に Windows Forms や WPF の知見がある
    • ➡️ .NET 7 の Windows Forms と WPF へ移行する

話せなかった内容(ぶっちゃけトーク)は
夜の部でやります😏

公式ドキュメント