29.3K Views
June 18, 22
スライド概要
.NET MAUI の Xamarin.Forms と比べた主な改善点について。
SIerの人。Xamarin.iOS が好き。Azure と戯れるのが仕事。Visual Studio for Mac が Win版と同等になる日を切望。Microsoft MVP Developer Technologies 2017-
.NET MAUI、 何がうれしいの? Tomohiro Suzuki @hiro128_777
自己紹介 鈴木友宏 Microsoft 製品の技術支援の仕事をしています。 Twitter:@hiro128_777 blog:https://hiro128.hatenablog.jp/ 2
Xamarin.Foms と .NET MAUI 何が違う? 3
Xamarin.Forms と .NET MAUIの主な違い Xamarin.Forms プロジェクトの構造 .NET MAUI 非SDKスタイル(Franken-proj) SDK スタイル プラットフォームごとに個別のプロジェクトを使用 単一のプロジェクトで、複数プラットフォームを ターゲットにできる ツールチェーン .NETFramework .NET CLI リソース管理 プラットフォームごとに個別管理 単一のプロジェクト内で一元管理 ネイティブ UI コントロールのカスタマイズ プラットフォーム固有のデバイスの解像度に応じたイ SVGを準備し、各プラットフォームの解像度の メージを準備 PNGに変換できる ブートストラップ 独自(App クラス) .NET Generic Host ホットリロード 完全な XAMLホットリロード 完全な .NETホットリロード (SDK5.x および Visual Studio 2019 16.9以降) 完全な XAMLホットリロード UI コントロール アーキテクチャ レンダラー ハンドラー 4
最大のコンセプトの違いは、レンダラーからハンドラーへの変更 ハンドラーアーキテクチャの採用によってプラットフォーム固有のレン ダリングの責務を、共有コードの抽象化 UI フレームワークの実装 から分離したこと。 5
Xamarin.Forms レンダラーアーキテクチャー 共有コード プラットフォーム固有コード Xamarin.Forms.Platform.iOS Xamarin.Forms LabelRenderer Label Xamarin.Forms.Platform.Android LabelRenderer レンダラーは、共有プロジェクトの UI コントロール実装に依存している 6
Xamarin.Forms レンダラーアーキテクチャーの問題点 • レンダラーが Xamarin.Forms の UI コンポーネントと密結合している。 • アセンブリスキャンとリフレクションというコストの大きい処理を使用して UI コントロールのレンダ ラーを取得するため遅い。 • 共有プロジェクトからネイティブ UI コントロールにアクセスする場合、レンダラーを介してアクセス する手段は一応あるが非常に手間がかかる。 • 共有プロジェクトからネイティブ UI コントロールのプロパティを変更する場合、たった1つのプロパ ティの変更であっても、共有プロジェクトとネイティブプロジェクトにまたがるレンダリングの仕組 みを理解した上で、レンダラーに対し定型的な多くのコードを記述する必要があり、非常に手 間がかかる。 7
.NET MAUI ハンドラーアーキテクチャー 共有コード 抽象化UIコントロール インターフェース プラットフォーム固有コード Partial Class Microsoft.Maui.Controls Microsoft.Maui Microsoft.Maui.Handlers Label ILabel LabelHandler LabelHandler.cs LabelHandler.iOS.cs LabelHandler.Android.cs Microsoft.Maui.Controls Microsoft.Maui Microsoft.Maui.Handlers ハンドラーはインターフェースにのみ依存し、共有プロジェクトの抽象化 UI コントロールの実装には依存し ない。 共有プロジェクトでも、プラットフォーム固有プロジェクトでも、ネイティブ UI コントロールを直接操作できる 8
.NET MAUI で導入されたハンドラーアーキテクチャー Xamarin.Forms におけるレンダラーの役割は、.NET MAUI のハンドラーに引き継がれました。 最大のコンセプトの違いは、ハンドラによって処理されるプラットフォーム固有のレンダリングの責 務を、共有コードの抽象化 UI フレームワークの実装から分離したことです。 これによって以下のようなメリットが生まれました。 • ハンドラーはアセンブリスキャンが不要➡︎速度向上 • 共有コード内でもでもネイティブ UI コントロールに直接アクセスしてプロパティを変更できる。 • ハンドラーは、.NET MAUI の .NET Generic Host 内に直接記述も可能で、簡単に実装およ び使用でき、特定のコントロール、またはアプリで使用されるすべてのコントロールに簡単に追 加できる。 9
(参考).NET Generic Host 単一のクロスプラットフォームアプリエントリポイント(MauiProgram.cs)でアプリのグローバル構 成を管理するデザインパターンであり、シンプルで保守も簡単です。 プラットフォームフォルダには、各プラットフォームでアプリを起動するプラットフォーム固有のコードが 含まれています。 なお、Blazor アプリや ASP.NET Coreアプリでも同様のパターンが提供されています。 ビルダーでは以下の内容を構成できます。 • 起動するアプリクラスの指定 • フォント登録 • Dependency injection • ネイティブ UI コントロールのカスタマイズ 1
.NET MAUI のブートストラップ サンプルコード MauiProgram.cs 11
起動するアプリクラスの指定 MauiProgram.cs App.xaml.cs 12
フォントの登録 MauiProgram.cs 13
Dependency injection : AppSlell クラスを DI コンテナに登録 MauiProgram.cs App.xaml.cs 14
ネイティブ UI コントロールのカスタマイズ MauiProgram.cs レンダリング結果 共有プロジェクトでも、ネイティブ UI コントロールを直接操作できる 15
まとめ .NET MAUI のアドバンテージは、以下の2点に集約されます。 • Xamarin.Forms の面倒だった部分が非常に扱いやすくなり、直感的でシンプルなコードで記 述できるよう改善された。 • アセンブリスキャンやリフレクションなどコストの高い処理を回避し速度が向上した。 つまり、「 .NET MAUI = より簡単で使いやすくなった Xamarin.Forms」と言えます。 というわけで、早速使ってみましょう! 16
ご清聴ありがとうございました