.NET MAUIは、C#とXAMLでネイティブアプリケーションを作成するためのクロスプラットフォームMicrosoftフレームワークであり、2022年に.NET 6とともにリリースされました。Microsoft .NET MAUI Documentation, 2024によると、MAUIはiOS、Android、Windows、macOS、Tizenをサポートし、これらを共通のコードベースを持つ単一のプロジェクトに統合します。このフレームワークはXamarin.Formsの直接の後継です。
重要ポイント
.NET MAUI(Multi-platform App UI)は、Xamarin.Formsの進化版であり、.NET 6+向けにゼロから再構築されました。各プラットフォームに個別のプロジェクトが必要だったXamarin.Formsとは異なり、MAUIは共有の.csprojファイルとプラットフォームフォルダ(Platforms/iOS、Platforms/Android、Platforms/Windows、Platforms/MacCatalyst)を持つ単一の構造を使用します。最初の安定版MAUIリリースは2022年5月でした。
.NET MAUIとその前身との主な違いは、.NET 8 BCL(基本クラスライブラリ)との完全な統合です。開発者は、追加のSDKなしでSystem.Text.Json、System.Net.Http、System.Linq、System.IOなどのAPIに直接アクセスできます。Xamarin.Formsは共有ロジックに.NET Standard 2.0を使用しており、新しい.NETプラットフォーム機能へのアクセスが制限されていました。
Microsoft Build 2024によると、.NET MAUIはApp StoreとGoogle Playで40,000以上のアプリケーションで使用されています。注目すべきプロジェクトには、UPS Mobile、The Weather Channel、Siemens Teamcenterがあります。Microsoftは、2024年11月に予定されている.NET 9の一部としてMAUIを積極的に開発しています。
.NET MAUIの発表は、.NET統一戦略の一環としてMicrosoft Build 2020で行われました。Microsoftは.NET Core、Mono、.NET Frameworkを単一の.NET 5+プラットフォームに統合しました。Xamarin.FormsはMAUIの基盤となりましたが、コードベースは完全に書き直され、古いAPIは削除され、レンダラーはHandlersに置き換えられ、DependencyServiceはDIコンテナに置き換えられました。
.NET MAUI 8(2023年11月)は、Native AOT、改善されたCollectionViewパフォーマンス、Blazor Hybrid(MAUIアプリケーションへのBlazorコンポーネントの埋め込み)、新しいフォントマッピングのサポートを追加しました。.NET MAUI 9(2024年)には、C# 12のサポート、改善されたWinUI 3とmacOS Sonomaの統合、および全プラットフォーム向けの新しいDrag & Drop APIが含まれています。
最初の違いは単一アプリケーションです。Xamarin.Formsでは、iOSとAndroidに1つのソリューション内で2つの個別プロジェクトが必要でした。.NET MAUIでは、プラットフォームフォルダを持つ1つのプロジェクトです。これにより、コードナビゲーション、依存関係管理、CI/CDパイプラインが簡素化されます。.csprojファイルは、TargetFrameworks: net8.0-android、net8.0-ios、net8.0-maccatalystを持つSDK形式を使用します。
2つ目の違いは、レンダラーの代わりにHandlersを使用するレンダリングアーキテクチャです。Xamarin.Formsでは、各要素(Button、Label)にネイティブコントロールを作成する独自のRendererクラスがありました。カスタマイズにはCustom Rendererが必要でした。MAUIでは、Handlerは抽象要素をネイティブコントロールにマッピングする軽量オブジェクトであり、コントロールを再作成せずにプロパティを更新するProperty Mappersをサポートします。
3つ目の違いは、統一DIコンテナ Microsoft.Extensions.DependencyInjectionです。Xamarin.Formsはプラットフォーム実装の登録にDependencyServiceを使用していました。MAUIはDIをフレームワークコアに組み込んでいます。サービスはMauiAppBuilderに登録され、コントローラーはコンストラクターを介して依存関係を受け取ります。これによりテストが簡素化され、現代の.NETプラクティスに従います。
.NET MAUIのアーキテクチャは、マルチレイヤーモデルに基づいています。最下層は.NET BCLとMono Runtime(Android)/ CoreCLR(Windows)/ NativeAOT(iOS)です。中間層はフレームワークコア(Handlers、Layout、Graphics、Controls)を持つMicrosoft.Maui.dllです。最上層はXAMLページ、ViewModel、サービスを持つ開発者のアプリケーションです。
Single Projectは、.NET MAUIの主要なアーキテクチャ上の特徴です。すべてのファイルは、共有コード(Shared)、プラットフォームコード(Platforms)、リソース(Resources)の3つのカテゴリに分けられます。.csprojのMulti-targetingは、アプリケーションがどのプラットフォーム向けにビルドされるかを指定します。各プラットフォームは、自身のPlatformsフォルダと共有コードのみをコンパイルします。
プラットフォームコードは条件付きフォルダに配置されます。Platforms/AndroidにはMainActivity.cs、MainApplication.cs、AndroidManifest.xmlが含まれます。Platforms/iOS — AppDelegate.cs、Info.plist、Entitlements.plist。Platforms/Windows — Package.appxmanifest、App.xaml。条件付きコンパイルのために、コードは#if ANDROID、#if IOS、#if WINDOWS、#if MACCATALYSTディレクティブを使用します。
XAMLは、Xamarin.FormsとWPFから継承された宣言型マークアップ言語です。.NET MAUIでは、XAMLを使用してページ(ContentPage)、レイアウト(VerticalStackLayout、Grid、FlexLayout)、要素(Label、Entry、Button、Image)、コントロール(CollectionView、CarouselView)を記述します。XAMLはビルド時にBAML形式にコンパイルされます。
MVVMパターンは、CommunityToolkit.Mvvm(Microsoftのオープンソースライブラリ)を通じて実装されます。[ObservableProperty]属性はINotifyPropertyChangedプロパティを生成し、[RelayCommand]はメソッドからコマンドを作成します。CommunityToolkit.Mvvm 8.2 Source Generatorは部分クラスViewModelを変換し、ReflectionなしでObservableObjectを生成します。これにより、手動実装と比較してBindingが30%高速化されます。
using Microsoft.Maui;
using Microsoft.Maui.Controls;
namespace MauiApp;
public class MainPage : ContentPage
{
public MainPage()
{
Title = "MAUI App";
Content = new VerticalStackLayout
{
Spacing = 12,
Padding = new Thickness(16),
Children =
{
new Label
{
Text = "Hello, .NET MAUI!",
FontSize = 24,
FontAttributes = FontAttributes.Bold
},
new Button
{
Text = "クリックしてください",
BackgroundColor = Colors.Blue,
TextColor = Colors.White,
Command = new Command(async () =>
await DisplayAlert("こんにちは", "世界", "OK"))
}
}
};
}
}
.NET MAUIは5つのプラットフォームをサポートしています:iOS 15.0+、Android 5.0(API 21)+、Windows 10 1809+、macOS 12.0+(MacCatalyst)、Tizen 6.5+。各プラットフォームは独自のコントロールとAPIを使用します。iOSはMac Catalyst経由でUIKitを使用し、AndroidはXamarin.Android経由でAndroidX、WindowsはWinUI 3、macOSはMac Catalyst経由でAppKitを使用します。
iOSとAndroidでは、MAUIはXamarin.Formsと同じレンダリングメカニズム(ネイティブUIコントロール)を使用します。ただし、Handlersはより柔軟なカスタマイズを提供します。iOSでのプラットフォーム固有のButton設定には、PlatformConfiguration.iOSと共にOnPlatform<Button>が使用されます。Windowsでは、MAUIはWinUI 3(Fluent Design SystemをサポートするMicrosoftのモダンUIフレームワーク)を使用します。
macOSのサポートは、Mac Catalyst(MacでUIKitアプリケーションを実行するAppleのテクノロジー)を介して追加されました。これにより、アプリケーションのmacOSバージョンにMAUI iOSコードの100%を再利用できます。特定のMac機能(Menu Bar、Touch Bar)については、MAUIはMac CatalystとNSViewラッパーを介してプラットフォームAPIを提供します。
Tizenは、Smart TV、スマートフォン、スマートウォッチ向けのSamsungのプラットフォームです。.NET MAUIでのTizenサポートは、Samsung Tizen .NETを介して実装されています。MAUIアプリケーションは、Samsung TizenFXバインディングを通じてTizen用にコンパイルされます。ただし、TizenはMicrosoftの優先プラットフォームではありません — そのアップデートは1〜2か月遅れてリリースされます。
| プラットフォーム | 最小バージョン | UIフレームワーク | ステータス |
|---|---|---|---|
| iOS | iOS 15.0 | UIKit(Mac Catalyst) | 安定 |
| Android | API 21(5.0) | AndroidX / Material 3 | 安定 |
| Windows | Win 10 1809 | WinUI 3 / Fluent Design | 安定 |
| macOS | macOS 12.0 | AppKit(Mac Catalyst) | 安定 |
| Tizen | Tizen 6.5 | TizenFX / Samsung | 追加 |
統一コードベース — .NET MAUIはコードの重複を削減します。C#とXAMLの1つのプロジェクトが5つのプラットフォーム用にコンパイルされ、シンプルなUIのアプリケーションで最大95%の共有コードを提供します。ビジネスロジック、サービス、データモデル、HTTPクライアントは共有コードにあります。プラットフォーム固有の機能(カメラ、位置情報、生体認証)のみがDIを介した個別の実装を必要とします。
パフォーマンスは、.NET MAUIの方がXamarin.Formsよりも優れています。Handlersはレンダリングのオーバーヘッドを削減します。Microsoftのテストでは、Xamarin.Forms 5.0と比較して画面レンダリング時間が20〜30%短縮されています。iOSのNative AOTはC#コードをARM64命令に直接コンパイルし、JITコンパイルを排除して起動時間を40%短縮します。
Blazor Hybridは、.NET MAUIのユニークな機能です。BlazorWebViewはMAUIアプリケーションに直接Blazorコンポーネントを埋め込みます。Webインターフェース開発者は、モバイルアプリケーションでBlazorコンポーネント(Razorページ、JS相互運用、CSSスタイル)を再利用できます。Blazor Hybridは、Blazorコンポーネントコードを変更することなく、5つすべてのMAUIプラットフォームで動作します。
.NETエコシステム — 数千のNuGetパッケージにアクセス可能:データベース操作のためのEntity Framework Core、ログ記録のためのSerilog、HTTPリクエスト再試行のためのPolly、バリデーションのためのFluentValidation。CommunityToolkit.Mauiは、Popup、Toast、Snackbar、アクセシビリティのためのSemanticScreenReaderなどの既製のUI要素を提供します。.NET MAUIはAzure、SignalR、Microsoft Graph SDKと統合します。
開発ツール — Visual Studio 2022およびJetBrainsのRider。XAML Hot Reloadは、アプリケーションを再起動せずに1〜2秒でUIを更新します。C# Hot Reload(.NET 6+以降)は、プロセスを再起動せずにメソッドの変更を再コンパイルします。Visual Studio Debugger、Profiler、IntelliCodeが、パフォーマンス診断とコード品質のためのツールキットを補完します。
よくある質問
.NET MAUIは、iOS、Android、Windows、macOS、Tizen向けにC#とXAMLでネイティブアプリケーションを作成するためのMicrosoftのクロスプラットフォームフレームワークです。これはXamarin.Formsの後継であり、.NET 6+に組み込まれ、各プラットフォーム用の個別プロジェクトの代わりに単一プロジェクト(Single Project)を使用します。
.NET MAUIは、単一プロジェクト、レンダラーの代わりにHandlers、組み込みDIコンテナ、iOS用Native AOT、Blazor Hybridを使用します。Xamarin.Formsは各プラットフォームに個別のプロジェクトが必要で、UIカスタマイズにCustom Renderer、DIにDependencyServiceを使用し、Blazorをサポートしていません。.NET MAUIは.NETの一部であり、Xamarin.Formsは別個のSDKです。
はい、.NET MAUIはMac Catalyst(最小バージョンmacOS 12.0)を介してmacOSをサポートしています。MAUI上のiOSアプリケーションは、コード変更なしで自動的にMac用にコンパイルされます。ネイティブMac機能(Menu Bar、Dock、Touch ID)については、Platforms/MacCatalystフォルダ内のMac CatalystとNSViewラッパーを介したプラットフォームコールが使用されます。
いいえ、.NET MAUIはDart/Flutterパッケージと互換性がありません。MAUIは.NETエコシステムとNuGetパッケージを使用します。プラットフォーム固有の機能(カメラ、Bluetooth、生体認証)には、Android Bindings(Kotlin/Java)とiOS Bindings(Objective-C/Swift)を介したネイティブライブラリが使用されます。CommunityToolkit.Mauiは、一般的なシナリオ向けの既製ラッパーを提供します。
パフォーマンスの差は最小限です。iOSでHandlersとNative AOTを使用した.NET MAUIは、ネイティブSwiftUIアプリケーションのパフォーマンスの95〜98%を達成します。Androidでは、UIレンダリングテスト(Microsoft Benchmarks, 2024)において、Kotlinアプリケーションとの差は3〜7%です。ほとんどのビジネスアプリケーションでは、その差はユーザーにはわかりません。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。