---
title: MAUI の現状と進化ポイント
tags:  #.net maui #.net  
author: [Tomohiro Suzuki](https://www.docswell.com/user/hiro128_777)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/9J2N1K6MER.jpg?width=480
description: MAUI の現状と進化ポイント by Tomohiro Suzuki
published: September 30, 22
canonical: https://www.docswell.com/s/hiro128_777/KW79X5-2022-09-30-184910
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/9J2N1K6MER.jpg)

MAUI の現状と進化ポイント
Tomohiro Suzuki
@hiro128_777
2022-09-30
C# Tokyo


# Page. 2

![Page Image](https://bcdn.docswell.com/page/DEYPZN9PEM.jpg)

自己紹介
鈴木友宏
Microsoft 製品の技術支援の仕事をしています。
Twitter：@hiro128_777
blog：https://hiro128.hatenablog.jp/
2


# Page. 3

![Page Image](https://bcdn.docswell.com/page/VJN53XLM78.jpg)

MAUI とは
.NET Multi-platform App UI
• C# と XAML を使用して、ネイティブのモバイル アプリやデスクトッ
プ アプリを作成するためのクロスプラットフォーム フレームワーク
• Xamarin.Formsの後継であり、1 つの共有コード ベースから
Android、iOS、macOS、および Windows で実行できるアプリを
開発できる。
3


# Page. 4

![Page Image](https://bcdn.docswell.com/page/YE9Y984WJ3.jpg)

Xamarin and Xamarin.Forms のサポートはいつまで？
• Xamarin のサポートは、2024 年 5 月 1 日にすべて終了します。
• Android 13 および iOS/iPadOS 16/macOS 13 が、Xamarin がサポートす
る最終バージョンになります。
詳しくは以下を参照ください。
https://dotnet.microsoft.com/en-us/platform/support/policy/xamarin
4


# Page. 5

![Page Image](https://bcdn.docswell.com/page/GE8698QR7D.jpg)

Xamarin でできたことは、MAUIでもできるの？
Xamarin でサポートされていたプロジェクトは .NET MAUI でサポートされているのでしょうか。
というわけで.NET MAUI の主なプロジェクトテンプレートを Xamarin と比較してみました。
Xamarin
テンプレート名
.NET
テンプレート名
短い名前
(dotnet new &lt;TEMPLATE&gt;)
iOS アプリケーション（プレビュー）
ios
MacCatalyst アプリケーション（プレビュー）
maccatalyst
iOSアプリ
iOSアプリ（Xamarin）
watchOSアプリ
watchOSアプリ（Xamarin）
.NET 6 未サポート。.NET 7 での追加サポート予定もなし
https://twitter.com/davidortinau/status/1519303524726849536
Androidアプリ
Androidアプリ（Xamarin）
Android Application
android
Android Wear アプリ
Android Wear アプリ（Xamarin）
Android Wear Application
androidwear
モバイルアプリ
モバイルアプリ（Xamarin.Forms）
.NET MAUI アプリ
maui
macOSアプリ
cocoaアプリ（Xamarin）
macOS アプリケーション（プレビュー）
macOS
MacCatalyst アプリケーション（プレビュー）
maccatalyst
「短い名前」は、 .NET CLI で
dotnet new maui i
のように「短い名前」をテンプレート名として使うことでプロジェクトを作成できます。
5


# Page. 6

![Page Image](https://bcdn.docswell.com/page/LEL9WRX2JR.jpg)

watchOS アプリは未サポート .NET 7 での予定もなし
.NET では watchOS アプリは未
サポートです。今のところ .NET 7
での追加サポート予定もありませ
ん。
（たいして使われていない割に、
サポートするには手間がかかるた
め、予定がないとのことです。）
右記、.NET MAUI のプロダクトマ
ネージャーのツイートです。
6


# Page. 7

![Page Image](https://bcdn.docswell.com/page/4JMZ9RL9EW.jpg)

MAUI が Xamarin.Foms と比べて便利になったところ
7


# Page. 8

![Page Image](https://bcdn.docswell.com/page/PJR6GRK979.jpg)

Xamarin.Forms と .NET MAUIの主な違い
Xamarin.Forms
プロジェクトの構造
.NET MAUI
非SDKスタイル（Franken-proj）
SDK スタイル
プラットフォームごとに個別のプロジェクトを使用
単一のプロジェクトで、複数プラットフォームを
ターゲットにできる
ツールチェーン
.NET Framework
.NET CLI
リソース管理
プラットフォームごとに個別管理
単一のプロジェクト内で一元管理
ネイティブ UI コントロールのカスタマイズ
プラットフォーム固有のデバイスの解像度に応じたイ SVGを1つだけ準備すれば、各プラットフォーム
メージを準備しなければいけない
の解像度のPNGに変換される
ブートストラップ
独自（App クラス）
.NET Generic Host
ホットリロード
完全な XAMLホットリロード
完全な .NETホットリロード
（SDK5.x および Visual Studio 2019 16.9以降） 完全な XAMLホットリロード
UI コントロール
アーキテクチャ
レンダラー
ハンドラー
8


# Page. 9

![Page Image](https://bcdn.docswell.com/page/PEXMXRL37X.jpg)

SDK スタイルプロジェクト
• インクルードするファイルのリストを保持する必要がなく、逆に除外するファイルのリストが保持
できる。ファイルはcsprojのフォルダーに置くだけで追加される。プロジェクトの参照とパッケージ
の参照だけのみとなり、csprojファイルがシンプルになる。
• MS buildのターゲット ’restore’ を使って、NuGetのリストアを実行できる（MSBuild
/t:restore）
• csprojをアンロード、リロードすることなく、Visual Studio で直接編集し、リロードできる。
9


# Page. 10

![Page Image](https://bcdn.docswell.com/page/3EKGWRLNJD.jpg)

単一のプロジェクトで、複数プラットフォームをターゲットにできる
単一のプロジェクト。単一のマニフェストでアプリのタイトル、ID、バージョンを指定できる
プラットフォーム SDK
ワークロードとして.NET 6 に含まれる（ワークロードは明示的インストールが必要）
プラットフォーム固有コード
ここ以外の共通コード内でも、プラットフォーム固有の API にアクセスできる
リソースの一元管理
たとえば、Image は SVG を1つだけ準備すれば、各プラットフォームの解像度のPNGに変換される
クロスプラットフォームのアプリのエントリーポイント（Generic Host 対応）
10


# Page. 11

![Page Image](https://bcdn.docswell.com/page/L73N183Z75.jpg)

Xamarin.Forms のレンダラーアーキテクチャー
共有コード
プラットフォーム固有コード
Xamarin.Forms.Platform.iOS
Xamarin.Forms
LabelRenderer
Label
Xamarin.Forms.Platform.Android
LabelRenderer
レンダラーは、共有プロジェクトの UI コントロール実装に依存している
11


# Page. 12

![Page Image](https://bcdn.docswell.com/page/87DWXM44JG.jpg)

Xamarin.Forms のレンダラーアーキテクチャーの問題点
• レンダラーが Xamarin.Forms の UI コンポーネントと密結合している。
• アセンブリスキャンとリフレクションというコストの大きい処理を使用して UI コントロールのレンダ
ラーを取得するため遅い。
• 共有プロジェクトからネイティブ UI コントロールにアクセスする場合、レンダラーを介してアクセス
する手段は一応あるが、手間がかかり使い勝手が悪い。
• 共有プロジェクトからネイティブ UI コントロールのプロパティを変更する場合、たった1つのプロパ
ティの変更であっても、共有プロジェクトとネイティブプロジェクトにまたがるレンダリングの仕組
みを理解した上で、レンダラーに対し定型的な多くのコードを記述する必要があり、使い勝手
が悪い。
12


# Page. 13

![Page Image](https://bcdn.docswell.com/page/VJP9PRMVE8.jpg)

.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 コントロールを直接操作できる
13


# Page. 14

![Page Image](https://bcdn.docswell.com/page/2EVM2R9REQ.jpg)

.NET MAUI で導入されたハンドラーアーキテクチャー
Xamarin.Forms におけるレンダラーの役割は、.NET MAUI のハンドラーに引き継がれました。
最大のコンセプトの違いは、ハンドラによって処理されるプラットフォーム固有のレンダリングの責
務を、共有コードの抽象化 UI フレームワークの実装から分離したことです。
これによって以下のようなメリットが生まれました。
• ハンドラーはアセンブリスキャンが不要➡︎速度向上
• 共有コード内でもでもネイティブ UI コントロールに直接アクセスしてプロパティを変更できる。
• ハンドラーは、.NET MAUI の .NET Generic Host 内に直接記述も可能で、簡単に実装およ
び使用でき、特定のコントロール、またはアプリで使用されるすべてのコントロールに簡単に追
加できる。
1


# Page. 15

![Page Image](https://bcdn.docswell.com/page/57GGRMZ67L.jpg)

（参考）.NET Generic Host
単一のクロスプラットフォームアプリエントリポイント（MauiProgram.cs）でアプリのグローバル構
成を管理するデザインパターンであり、シンプルで保守も簡単です。
プラットフォームフォルダには、各プラットフォームでアプリを起動するプラットフォーム固有のコードが
含まれています。
なお、Blazor アプリや ASP.NET Coreアプリでも同様のパターンが提供されています。
ビルダーでは以下の内容を構成できます。
• 起動するアプリクラスの指定
• フォント登録
• Dependency injection
• ネイティブ UI コントロールのカスタマイズ
1


# Page. 16

![Page Image](https://bcdn.docswell.com/page/4EQXVRL27P.jpg)

.NET MAUI のブートストラップ サンプルコード
MauiProgram.cs
16


# Page. 17

![Page Image](https://bcdn.docswell.com/page/KJ46M8DP71.jpg)

起動するアプリクラスの指定
MauiProgram.cs
App.xaml.cs
17


# Page. 18

![Page Image](https://bcdn.docswell.com/page/LE1V82ZX7G.jpg)

フォントの登録
MauiProgram.cs
18


# Page. 19

![Page Image](https://bcdn.docswell.com/page/GEWLZR9K72.jpg)

Dependency injection : AppSlell クラスを DI コンテナに登録
MauiProgram.cs
App.xaml.cs
19


# Page. 20

![Page Image](https://bcdn.docswell.com/page/47ZM1R9NE3.jpg)

ネイティブ UI コントロールのカスタマイズ
MauiProgram.cs
レンダリング結果
共有プロジェクトでも、ネイティブ UI
コントロールを直接操作できる
20


# Page. 21

![Page Image](https://bcdn.docswell.com/page/YJ6NLRK9JV.jpg)

Visual Studio 2022 の対応・動作状況 2022/09/30現在
Windows x64 環境のみ動作する状況
Visual Studio for Mac はバージョンアップすると逆に動かなくなったりと非常に不安定
iOS アプリ が Windows からのリモート接続で動作するので SDK 側は安定しており、単に VS4M がダメダメな状況
（VS4M 2019 : Xamarin.Mac（GTK# + AppKit）→ VS4M 2022 : .NET6（AppKit）で再実装している）
Windows x64
Android アプリ
対応
iOS アプリ
Visual Studio 2022 17.3.5
Xcode 13.3 で動作
MacCatalyst アプリ
Mac アプリ
非対応
（なのにプロジェクトが作れる笑）
MAUI アプリ
Android は問題なし
iOS は Visual Studio 2022 17.3.5
Xcode 13.3 で動作
Windows ARM64
ネイティブ UI コントロールのカスタマイズ
ワークロード自体が
まだ未対応
Mac ARM64
Stable：
未対応2022後半にサポート予
定
Preview：
現状 Buggy すぎてまともに動か
ない…
21


# Page. 22

![Page Image](https://bcdn.docswell.com/page/GJ5518PDJ4.jpg)

そもそも Microsoft 側のリソース少なすぎ問題
Visual Studio for Mac と MAUI tool で開発者7人！！…それは厳しすぎます…
Microsoft さん、もっと雇って！！
中の人のツイート⇨
ネイティブ UI コントロールのカスタマイズ
22


# Page. 23

![Page Image](https://bcdn.docswell.com/page/LE3N186QE5.jpg)

iOS の手動プロビジョニングが失敗する時
Xcode で同名の Bundle Identifier で空アプリを作成し、一度デプロイした後に Visual Studio で実行すると解決
します。
（Xamarin 時代からお馴染みの Tips）
（自動プロビジョニングもありますが、Apple Developer Program への加入が必要です）
ネイティブ UI コントロールのカスタマイズ
Visual Studio
Xcode
23


# Page. 24

![Page Image](https://bcdn.docswell.com/page/8EDWXMVW7G.jpg)

みなさまへのお願い
Microsoft に MAUI にもっと開発リソースを割いてもらうためには
24


# Page. 25

![Page Image](https://bcdn.docswell.com/page/V7P9PRVXJ8.jpg)

MAUI がもっと進化するためには
https://developercommunity.visualstudio.com/
にフィードバックして直接圧力アピール！！
インストール、プロジェクト作成、ビルドを実行してテレメトリーを飛ばす！
25


# Page. 26

![Page Image](https://bcdn.docswell.com/page/2JVM2RZ3JQ.jpg)

ご清聴ありがとうございました


