.NET MAUI
.NET MAUIは、Microsoftが開発・提供しているオープンソースのクロスプラットフォームフレームワークです。前身であるXamarin.Formsの進化形として開発されており、単一のC#コードベースと単一のプロジェクト構成から、Windows、macOS、iOS、Android向けの完全なネイティブアプリケーションをビルドできます。
.NET MAUIの特徴
.NET MAUIの大きな特徴は、UIがWebView(ブラウザエンジン)で描画されるのではなく、各プラットフォームが提供するネイティブUIコントロールとして直接レンダリング(描画、表示)される点です。
具体的に示すと、<Button>や<Label>といった、.NET MAUIの抽象化されたUIコントロールを、XAML(XMLベースのマークアップ言語)またはC#コードで記述するだけで、コンパイル時や実行時に各プラットフォームのネイティブコントロールに自動的に変換、描画されます。
この仕組みにより、アプリケーションは、各OSの標準的なルック&フィール(見た目と操作感)で、ネイティブアプリ並の高いパフォーマンスを実現します。
その他の特徴として、次の点が挙げられます。
単一プロジェクト構成
以前のXamarin.Formsでは、共有コードプロジェクトとは別に、プラットフォームごとの専用プロジェクトファイルが必要でした。.NET MAUIでは、すべてが1つのプロジェクトファイルに統合されています。これにより、ライブラリの管理やビルド設定、依存関係の解決などが簡素化され、開発効率が大きく向上しました。テンプレートで生成される初期のプロジェクト構造は、次のようになります。
UIコントロールとレイアウトシステム
.NET MAUIでは、多くのUIコントロールと、次のレイアウトシステムが標準で提供されています。
レイアウト名 | 概要 |
---|---|
Grid | 行と列を定義する表形式レイアウト |
FlexLayout | CSS Flexboxと同様の柔軟なレイアウト |
StackLayout | 縦方向または横方向に要素を順次配置するレイアウト |
AbsoluteLayout | 絶対座標による位置を定義するレイアウト |
MVVMパターンとデータバインディングのサポート
MVVM(Model-View-ViewModel)パターンとは、UIとロジックを分離する設計パターンです。アプリケーションの保守性と拡張性を高めることができます。
コンポーネント | 概要 |
Model | データとビジネスロジック(業務処理) |
View | UI(画面表示) |
ViewModel | ViewとModelの橋渡し(データバインディング) |
データバインディング機能により、ViewModelのプロパティ(データ)の変更が自動的にUI要素に反映されます。また逆に、UI要素の変更もViewModelに自動で伝播します。このしくみにより、UIの状態管理がシンプルになり、テストしやすく保守性の高いコードを記述できます。
ネイティブAPIのアクセス
.NET MAUIでは、センサーやカメラといったデバイス固有の機能、通知システムなどのOS固有のAPIに直接アクセス可能です。これにより、Web技術だけでは難しい高度な機能も実装可能です。
Blazor
Blazorは、C#と.NETを用いてWebアプリケーションを開発するためのフレームワークです。Webでの動的な処理は、従来、JavaScriptを用いるのが一般的でした。しかしBlazorでは、WebAssemblyという技術を活用して、.NETのコードをブラウザ上で直接実行することが可能です。WebAssembly(WASM)は、ブラウザ上で高速に実行できるバイナリ形式のコードです。W3C(World Wide Web Consortium)によって標準化された技術で、JavaScript以外の言語(C++、Rust、C#など)で書かれたコードをブラウザ上で実行できます。
Blazoについては、「ASP.NET Core Blazorチュートリアル」の記事も参考にしてください。
Blazorの特徴
Blazorでは、Razorというテンプレート構文でUIコンポーネントを記述します。Razor構文では、HTMLマークアップ内に@記号を使って、C#のコードを自然に直感的な形で記述できます。
次のサンプルページは、ボタンクリックで挨拶メッセージを変更するものです。
@page "/greeting" <p>今日は @today.ToLongDateString() です。</p> <input @bind="name" placeholder="名前を入力してください" /> <button class="change-button" @onclick="ChangeGreeting">挨拶を変更</button> <p class="message">@message</p> @code { private string name = "ゲスト"; private DateTime today = DateTime.Now; private string message = "素敵な一日になりますように!"; private void ChangeGreeting() { message = $"{name} さん、今日もがんばりましょう!"; } }
このように、ひとつのファイル(.razorファイル)内で、コンポーネントのUI構造(HTML)や動作ロジック(C#)を統合的に記述できます。
Blazorのホスティングモデル
ホスティングモデルとは、Blazorアプリがどこで実行されるか(サーバーかクライアントか)を決める仕組みのことです。Blazorでは、次の2つのホスティングモデルが提供されています。
Blazor Server
アプリケーションのロジックはサーバー上で実行し、UIの更新情報だけをSignalRというリアルタイム通信を使ってクライアント(ブラウザ)に送信するモデルです。SignalRは、サーバーとクライアント間で、HTTP接続よりも低遅延な双方向通信を実現するためのライブラリです。
ブラウザでボタンクリックなどの操作を行うと、その情報がサーバーに送られてUIの差分を計算し、更新が必要な部分だけを、サーバーがクライアントに送り返して画面を描画します。リアルタイム性が高い反面、常にサーバーとの接続が必要なため、オフラインでは動作しません。
Blazor WebAssembly (Wasm)
Blazor WebAssemblyは、WebAssembly技術を使い、C#や.NETのコードをブラウザ上で直接実行するモデルです。アプリケーションの初回アクセス時に、.NETランタイムなどのファイルがブラウザにダウンロードされ、その後は、クライアントのみでアプリケーションが動作します。サーバーと通信する必要がある場合は、Web API呼び出しを通じて行います。
対話型レンダリングモード
.NET 8以降のBlazorでは、従来のServer/WebAssemblyの選択に加えて、次のような対話型レンダリングモードが導入されています。対話型レンダリングモードとは、「どこで、どのようにUIをインタラクティブ(対話型)にするか」という選択肢です。
Blazorでは、ページやコンポーネントの要件に応じて最適なモードを選択できる仕組みが提供されています。
静的サーバー (Static SSR)モード
サーバー側でHTMLを生成し、ブラウザに送信するだけの最もシンプルなモードです。クライアント側は、受け取ったHTMLを表示するだけで、ボタンのクリックなどのイベントには反応しません。
対話型サーバー (Interactive Server)モード
従来のBlazor Serverのモードです。
対話型WebAssembly(Interactive Wasm)モード
従来のBlazor WebAssemblyのモードです。
自動(Interactive Auto)モード
上記の対話型サーバーモードとWasmモードの「いいとこどり」とも言えるモードです。最初はサーバーモードで迅速にページを表示し、ユーザーの待機時間を最小限に抑えます。その間に、裏でWasmのダウンロードを進めます。ダウンロードが完了すると、自動的にWasmモードに切り替わり、以降はクライアント側で快適に動作します。