はじめに
こんにちは、エンジニアの庭山(@rkoubou_jp)です。
この記事はSynamon Advent Calendar 2021の16日目です。
前回書いた記事 「いろいろな種類がある .NET の違いとは」で.NETのことを書かせて頂きました。
今回は先日リリースされた .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 プレビュー版を手元の環境で試行錯誤してみました。
環境
今回は以下の環境で試しました。
- Windows 10
- .NET 6.0.100 (x64)
- Visual Studio 2022 (17.1 Preview)
- macOS Big Sur (Intel Mac)
- .NET 6.0.100 (x64)
- Visual Studio 2022 for Mac (Preview)
- Xcode 13.1
MAUIとは
Multi-platform App UI の略称。
.NET マルチプラットフォームアプリ UI (.NET MAUI) は、C# および XAML を使用してネイティブのモバイルアプリとデスクトップアプリを作成するためのクロスプラットフォームフレームワークです。
引用元:.NET MAUI とは - .NET MAUI | Microsoft Docs
いわゆるGUIフレームワークで、デスクトップアプリケーションからモバイルアプリケーションまで対応しています。Xamarinの後継とも言われています。
MAUI GAリリースまでの間はプレビュー版を使う
2021/12/13時点の Visual Studio 2022 GA版 (17.0.x) では新規プロジェクト作成からテンプレートを選択・ソリューションを作成しても正常に動作しません。
このプロジェクトは、Visual Studio の現在のエディションと互換性がありません。
…
Windows
Visual Studio Preview のダウンロードとインストール
Visual Studio Installer で追加でインストールしたワークロードは
- .NET によるモバイル開発
- .NET デスクトップ開発
- C++によるデスクトップ開発
です。
プレビュー版 Visual Studio で新規プロジェクトの作成が出来るようにはなりました
新規作成直後の状態でビルドが出来ない…
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生成のバグでしょうか。
エラーメッセージ部分の箇所をダブルクリックすると該当ファイルが開かれるので 1.0
を 1
に直し、再度ビルドを試み、ビルドが成功しました。
Windows アプリケーション (WindowsUI) の起動が出来ない
実行ボタンをクリックしても以下のエラーが出て実行できませんでした。
bin
ディレクトリ以下にある exe ファイルを直接実行しても何も表示されず…。
Android アプリケーションは実行出来た
Visual Studio の実行プロファイルを切り替えAndroid向けの実行を行ったところインストール、実行が出来ました。
ただ、前述のVersionCodeの問題があるため、再ビルドの度に1.0
に巻き戻されたら1
に書き換える必要がありました。
macOS
上記のプロジェクトファイルをMacに持ってきてビルドを試してみます。
Visual Studio 2022 for Mac Preview のダウンロードとインストール
ソリューションファイルを開いたところ。(プロジェクトファイルの読む込みは問題無さそうです。)
が、やはり一発でビルドを成功させてもらえません…エラー内容を読んで原因を追ってみます。 MacCatalyst用のInfo.plistの内容に問題があるようです
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
のバージョンと推察されます。
再びビルドを試みます。
ビルド(macOS)に成功しました!
Macでの実行
iPhone (シミュレーター) での実行
ビルドエラー...
Error NETSDK1047: 資産ファイル 'HelloWorld/obj/project.assets.json' に 'net6.0-ios/iossimulator-x64' のターゲットがありません。 復元が実行されたこと、および 'net6.0-ios' がプロジェクトの TargetFrameworks に含まれていることを確認してください。 プロジェクトの RuntimeIdentifiers に 'iossimulator-x64' を組み込む必要が生じる可能性もあります。 (NETSDK1047)
TargetFrameworks
に iossimulator-x64
を加えましたが NuGetの復元で Invalid restore input. Invalid target framework 'unsupported'
と怒られてしまいました…。
Web検索を駆使したところ、ほぼタイムリーで同じ問題に関するディスカッションを見つけました。
が、手元では根本的な解決には至らなかったため、ここは初心に帰り「最小構成」に削ぎ落としてみます。具体的には TargetFrameworks
を ios のみにします。
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <!-- 他のプラットフォームは一旦無視し、iOSのみにした --> <TargetFrameworks>net6.0-ios</TargetFrameworks> : : :
Visual Studio のビルドターゲットも ios のみしか選択できません
再びビルド。動きました!
Android (エミュレーター)での実行
TargetFrameworks
に net6.0-android
を設定し実行
Windowsの時と同様に VersionCode
が整数ではなく小数になっているためビルドエラーが出ますが、ダブルクリックして該当箇所を 1
に書き換えることで回避できます。
コマンドライン
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リリースまでは様子見をしようかなと思います。