.NET 6 MAUI(Preview)をWindowsとMacで触ってみたかった

はじめに

こんにちは、エンジニアの庭山(@rkoubou_jp)です。

この記事はSynamon Advent Calendar 2021の16日目です。

前回書いた記事 「いろいろな種類がある .NET の違いとは」で.NETのことを書かせて頂きました。

synamon.hatenablog.com

今回は先日リリースされた .NET6 の MAUI について書きました。

この記事では新規プロジェクト作成~ビルド、実行までの流れを記載しています。

*Visual Studio、MAUIのプレビュー版を使用しているため、GAリリースまでの間で発生するアップデートで挙動が変わる場合もあります。ご了承ください。


目次

タイトルが「触ってみたかった」という過去形の理由

結論から書くと、

想定以上に正式バージョン前のMAUIは手軽に動作確認環境を作ったり、ビルドや実行確認するのはちょっと大変、と感じました。

GAリリース前の物なのでそういうものなのかもしれません or または私の .NET 歴がそこまで長くなくて勝手が分かっていない説もあります。

試行錯誤の末、何とかビルド・実行はできた…

csprojファイルの TargetFrameworks値 を一旦目的のターゲットのみに書き換えるなどの多少強引な回避策でなんとかビルド、実行ができました。(WindowsUIのみ解決できず)

当初はビルドエラーや実行もできないというトラブルにハマり、一筋縄ではいきませんでしたが、せっかくなので、遭遇したトラブルや動かすところまでを残そうと思います。

.NET6は正式版(GA)になったけど、MAUIのGAは2022年度の2Qに計画変更が入っていた

「MAUIは.NET6のGAリリースと同時にPreviewが取れず、2022年の2QでGAリリースというアナウンス」をこの記事を書き始めた頃はまだそれを知らず、全ての .NET SDKやVSを完全にクリーンアップしたりなどをしてハマっていました。

検索を繰り返すうち、以下のフォーラムのやり取りを見てVisual Studio 2022 プレビュー版を手元の環境で試行錯誤してみました。

devblogs.microsoft.com

devblogs.microsoft.com

環境

今回は以下の環境で試しました。

MAUIとは

Multi-platform App UI の略称。

.NET マルチプラットフォームアプリ UI (.NET MAUI) は、C# および XAML を使用してネイティブのモバイルアプリとデスクトップアプリを作成するためのクロスプラットフォームフレームワークです。

f:id:niwayama-synamon:20211211234901p:plain

引用元:.NET MAUI とは - .NET MAUI | Microsoft Docs

いわゆるGUIフレームワークで、デスクトップアプリケーションからモバイルアプリケーションまで対応しています。Xamarinの後継とも言われています。

MAUI GAリリースまでの間はプレビュー版を使う

2021/12/13時点の Visual Studio 2022 GA版 (17.0.x) では新規プロジェクト作成からテンプレートを選択・ソリューションを作成しても正常に動作しません。

f:id:niwayama-synamon:20211212225713j:plain

このプロジェクトは、Visual Studio の現在のエディションと互換性がありません。

Windows

Visual Studio Preview のダウンロードとインストール

docs.microsoft.com

Visual Studio Installer で追加でインストールしたワークロードは

f:id:niwayama-synamon:20211213015820j:plain

  • .NET によるモバイル開発
  • .NET デスクトップ開発
  • C++によるデスクトップ開発

です。

プレビュー版 Visual Studio で新規プロジェクトの作成が出来るようにはなりました

f:id:niwayama-synamon:20211213013719j:plain

新規作成直後の状態でビルドが出来ない…

f:id:niwayama-synamon:20211213021017j:plain

XA0003 VersionCode 1.0 is invalid. It must be an integer value. C:\***HelloWorld\HelloWorld\obj\Debug\net6.0-android\android\AndroidManifest.xml

AndroidのVersionCode値が整数ではなく小数で記述されている、という指摘を受けました。多分AndroidManifest.xml生成のバグでしょうか。

f:id:niwayama-synamon:20211213021202j:plain

エラーメッセージ部分の箇所をダブルクリックすると該当ファイルが開かれるので 1.01 に直し、再度ビルドを試み、ビルドが成功しました。

Windows アプリケーション (WindowsUI) の起動が出来ない

実行ボタンをクリックしても以下のエラーが出て実行できませんでした。

f:id:niwayama-synamon:20211213021450p:plain

binディレクトリ以下にある exe ファイルを直接実行しても何も表示されず…。

Android アプリケーションは実行出来た

Visual Studio の実行プロファイルを切り替えAndroid向けの実行を行ったところインストール、実行が出来ました。

ただ、前述のVersionCodeの問題があるため、再ビルドの度に1.0に巻き戻されたら1に書き換える必要がありました。

f:id:niwayama-synamon:20211213210646p:plain

macOS

上記のプロジェクトファイルをMacに持ってきてビルドを試してみます。

Visual Studio 2022 for Mac Preview のダウンロードとインストール

docs.microsoft.com

ソリューションファイルを開いたところ。(プロジェクトファイルの読む込みは問題無さそうです。)

f:id:niwayama-synamon:20211213174652p:plain

が、やはり一発でビルドを成功させてもらえません…エラー内容を読んで原因を追ってみます。 MacCatalyst用のInfo.plistの内容に問題があるようです

f:id:niwayama-synamon:20211213175533p:plain

HelloWorld/MacCatalyst/Info.plist: Error: The LSMinimumSystemVersion value in the Info.plist (10.15) does not match the SupportedOSPlatformVersion value (15.0) in the project file (if there is no SupportedOSPlatformVersion value in the project file, then a default value has been assumed). Either change the value in the Info.plist to match the SupportedOSPlatformVersion value, or remove the value in the Info.plist (and add a SupportedOSPlatformVersion value to the project file if it doesn't already exist).

Info.plist の LSMinimumSystemVersion値と プロジェクト(*.csproj)の SupportedOSPlatformVersion値 が一致しないので合せるか Info.plist 内のLSMinimumSystemVersionを削除してSupportedOSPlatformVersion値を記述する必要がありそうです。

Info.plist内の LSMinimumSystemVersion を削除、 csproj ファイルに SupportedOSPlatformVersion 値を追記しました。(一部抜粋)

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <!-- iOS, Android, MacCatalyst -->
        <TargetFrameworks>net6.0-ios;net6.0-android;net6.0-maccatalyst</TargetFrameworks>
        <OutputType>Exe</OutputType>
        <SingleProject>true</SingleProject>
        <RootNamespace>HelloWorld</RootNamespace>
        <!-- ##### 追記 ##### -->
        <SupportedOSPlatformVersion>14.0</SupportedOSPlatformVersion>
        :
        :
        :
    </PropertyGroup>

指定する数値ですが、おそらく MacCatalyst のバージョンと推察されます。

再びビルドを試みます。

f:id:niwayama-synamon:20211213202909p:plain

ビルド(macOS)に成功しました!

Macでの実行

f:id:niwayama-synamon:20211213182742p:plain

f:id:niwayama-synamon:20211213182510p:plain

iPhone (シミュレーター) での実行

ビルドエラー...

Error NETSDK1047: 資産ファイル 'HelloWorld/obj/project.assets.json' に 'net6.0-ios/iossimulator-x64' のターゲットがありません。 復元が実行されたこと、および 'net6.0-ios' がプロジェクトの TargetFrameworks に含まれていることを確認してください。 プロジェクトの RuntimeIdentifiers に 'iossimulator-x64' を組み込む必要が生じる可能性もあります。 (NETSDK1047)

TargetFrameworksiossimulator-x64 を加えましたが NuGetの復元で Invalid restore input. Invalid target framework 'unsupported' と怒られてしまいました…。

Web検索を駆使したところ、ほぼタイムリーで同じ問題に関するディスカッションを見つけました。

github.com

が、手元では根本的な解決には至らなかったため、ここは初心に帰り「最小構成」に削ぎ落としてみます。具体的には TargetFrameworks を ios のみにします。

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <!-- 他のプラットフォームは一旦無視し、iOSのみにした -->
        <TargetFrameworks>net6.0-ios</TargetFrameworks>
        :
        :
        :

Visual Studio のビルドターゲットも ios のみしか選択できません

f:id:niwayama-synamon:20211213182915p:plain

再びビルド。動きました!

f:id:niwayama-synamon:20211213191549p:plain

Android (エミュレーター)での実行

f:id:niwayama-synamon:20211213201123p:plain

TargetFrameworksnet6.0-android を設定し実行

Windowsの時と同様に VersionCode が整数ではなく小数になっているためビルドエラーが出ますが、ダブルクリックして該当箇所を 1 に書き換えることで回避できます。

f:id:niwayama-synamon:20211213201727p:plain

コマンドライン

csprojファイルの TargetFrameworks を書き換えるのではなく、以下のようにコマンドで実行すれば同じかもしれません。

dotnet msbuild -t:build -p:TargetFrameworks=net6.0-ios
dotnet msbuild -t:build -p:TargetFrameworks=net6.0-android
dotnet msbuild -t:build -p:TargetFrameworks=net6.0-maccatalyst

さいごに

.NET6とGAリリースと同時にMAUIもGAリリースされたと思いこんでて、実はGAリリースされていないことを知った時は「締め切り近いのに、どうしたものかな…」と半日ほど悩みました。

が、せめてビルド・実行だけでもどうにかしておきたいな、と思い続けましたが何とかたどり着けました。

本当はこの記事内でGUIを色々いじって試したかったのですが、GAリリースまでは様子見をしようかなと思います。