Xamarin.Forms 使ったことある人が .NET MAUI を触ってみた

2022.06.18

いわさです。

先日、.NET MAUIが正式リリースとなりました。
プレビューのころに全く触っておらず、「.NET MAUIってのが出たらしいな...」程度だったのですが、Xamarin.Formsを以前少し触っていたので使い勝手など少し気になっており、今回初めて触ってみることにしました。

ほんと、触っただけ。

本記事では一部プレビュー機能について触れています。
公式ドキュメントのリンクを多めに入れておいたので、最新情報については公式ドキュメントもご確認ください。

.NET MAUI とは

.NET Multi-Platform App UI (.NET MAUI) は、C# と XAML を使用して、モバイルアプリやデスクトップアプリを作成するためのクロスプラットフォームフレームワークです。
Xamarin.Formsの後継という位置づけとなっています。

  • Visual Studio の単一の共有コードベースから、XAML と C# でクロスプラットフォームアプリを作成
  • プラットフォーム間で UI のレイアウトと設計を共有
  • プラットフォーム間でコード、テスト、ビジネス ロジックを共有

よく考えたら、Xamarin.Formsのちゃんとした思想を知らないですが、利用者から見ると同じな印象です。

Xamarin.Forms から移行する必要があるのか?移行方法は?

Xamarin Blogでは以下の記事にて次のように言及されていました。

For Xamarin.Forms customers, think of this as the next major version of the same product you know today. For developers new to multi-platform development with .NET, we invite you to take a look at what we are doing to serve you.

公式な移行やサポートのロードマップが見当たらなかったですが、next major versionと考えておくのが良さそうなので、Xamarin.Formsを利用している場合は.NET MAUIを意識しておいたほうが良さそうです。

移行方式としてはアプリケーションコードの変更が極力不要なようにXamarin.Formsとの互換性が意識されているようです。
今後変更の可能性はありますが、移行手順については以下へ記載されています。

Migrating from Xamarin.Forms (Preview) · dotnet/maui Wiki

サポートされているプロジェクトで、シンプルなHelloworld程度であれば、ランタイムの変更とコードの名前空間の変更、スタートアップコードなどの追加で移行出来そうな感じがします。
ただ、上記ドキュメントを見る限りではAPIやパッケージの互換性に関係していたりXAMLアップデートも必要な部分があるようなので何かしらの修正は発生しそうな予感がします。

現在WIPではありますが、.NET Upgrade Assistant Steps の記述があるのでこのあたりはかなり気になりますね。
移行の必要性に関する情報とあわせて移行方法についてもウォッチし、早めの移行検証を進めておきたいところです。

プロジェクト作って動かしてみる

Xamarin.Formsアプリケーションを現在運用している方にとっては、心配事が多い気もしますが、まぁ今日のところはアプリ作って動かしてみましょう。

まず、.NET MAUI自体は正式リリースされたのですが、Visual Studioでのサポートは実はまだプレビュー段階です。
よって、本日は Visual Studio 2022 17.3 Preview を使います。

プロジェクトテンプレートは3つ

本日時点でプロジェクトテンプレートとして、3つ提供されていました。

本日は .NET MAUI アプリ テンプレートを利用します。

.NET MAUI クラスライブラリは名前のとおり .NET MAUI 用のクラスライブリだろうと想像出来ますが、.NET MAUI Blazor アプリ とはなんでしょうか。

Blazor には Blazor Hybrid という概念があり、ざっくりいうとネイティブアプリケーション上のWebViewでRazorコンポーネントをレンダリングしてBlazorアプリ動かすぜというものです。
.NET MAUIでは専用コンポーネントBlazorWebViewが提供されており、これを使って.NET MAUIとBlazorを併用することが出来るようになるようです。

単一プロジェクト

プロジェクト作成後に最初に気がつくのが、ソリューション内に作成されるプロジェクトが一つという点でした。

Xamarin.Formsでは、それぞれのネイティブプロジェクト(Xamarin.iOS, Xamarin.Android ...)からFormsプロジェクトを参照する形でしたが、.NET MAUIではひとつのプロジェクトが提供され、Platformsフォルダ内にプラットフォーム固有のコードが実装されています。

ただし、下記ドキュメントによると、ビルドする際には特定のプラットフォーム用のコードやリソースのみが含まれるので、プラットフォームごとのビルドを行った際に、余計なリソースが同梱されてアプリケーションサイズが肥大したりはしないようです。

プロジェクトに含んだリソースファイルは適切なビルドアクションを設定することで、ビルド時にプラットフォームごとに必要なリソースが生成される仕組みとなっています。

プラットフォーム固有のコード

クロスプラットフォームということで気になるのがプラットフォーム固有のコードを利用する方法です。

.NET MAUIではその仕組が提供されています。
Xamarin.Forms では DependencyService などを用いてこのあたりを解決していたと思いますが、.NET MAUIでは下記ドキュメントのようにPartialクラスとPartialメソッドを使ってプラットフォームごとに実装したコードをクロスプラットフォームAPIとして呼び出ししています。

また、プラットフォーム固有のデバイスセンサーやバッテリなど様々な情報にアクセスするためのクロスプラットフォームAPIが標準提供されています。

Xamarin.Essentialsに非常に似ています。このあたりが取り込まれた形でしょうか。

ビルドして動かす

実際にビルドして動かしてみたいと思います。

MauiProgram.csやApp.csなどの中身やXAMLの変更点なども確認しましたが、このあたりは本日は割愛します。
また、プラットフォームごとの生成モジュールなどについても割愛します。

ドキュメントベースでざっくり抜粋だけすると、AndroidはILからのJITです。
iOSはAOTです。(macOS必要)
このまたりは Xamarin と同じ印象です。

WindowsはUWPではなくて、WinUI3となっていて、このあたりはXamarin.Formsと結構違っていそうです。
前述の移行ドキュメントでもUWPプロジェクトは対象外となっていたのはこれが理由のようですね。
Windowsプラットフォーム向けにXamarin.Formsを使っていた方は注意したほうが良さそうです。モバイルは概ね良さそう。

Windowsアプリを実行

手順は省略します。
デフォルトがWindows Machineになっていたので、実行ボタンでそのままデバッグ実行されます。

Androidエミュレーターで実行

こちらはAndroidエミュレータ(Pixel 5)で実行しました。
フレームワークでターゲットプラットフォームを選択する形ですね。このあたりも概ねXamarinと同じなのだと思いますが、単一プロジェクトでターゲットプラットフォームをどのように管理しているのか理解できていないのでそのあたりも今後掘り下げていきたいところです。

こちらも問題なく実行されました。
余談ですが、Xamarin を初めて動かすときはかなり苦労して色々な人を巻き込んだことを思い出しました。

さいごに

本日は、.NET MAUI を初めて触ってみました。
全然技術的なところの掘り下げができていなくて第一印象ばかり述べている気がしますが、今後掘り下げしていきたいところが多くありました。

私もいくつか Xamarin.Forms のプロダクトに関わってきたので、「.NET MAUI に移行できるのか...」など気になる点は多く、注目していきたいです。