MAUIプロジェクトのVS2026対応

先月Visual Studio2026が正式リリースされましたね。
弊社でも開発に使用すべく導入準備を進めております。
インストール時に2022の設定やコンポーネントなど引き継ぐ選択肢があったおかげで、
Windowsアプリのプロジェクトはすんなりと問題なく開発可能な状態にできました。
しかし、MAUIによるモバイルアプリプロジェクトの対応が難航したので、
ここに注意点などを記述しようかと思います。

1. プロジェクトの.NETバージョンは支障がなければ素直に10に上げるのが良いと思われます。
VS2026をインストールすると.NET8ではビルドできなくなります。(VS2022においてさえも!)
.NET9も試したのですが、こちらもiOSビルド時に発生するエラーを解決できず、時間を溶かしました。
他の方も.NET10に上げたら上手く行ったという報告を見かけたので、
ほぼ間違いなく.NET10が推奨だと思われます。

2. .NET10に上がったことで、iOSをビルドするXcodeのバージョンも上げる必要があります。
新しい環境でビルドが成功するまでは古いバージョンのXcodeを残しておきたいと思うのですが、
その場合はAppStoreで更新をせずにAppleのDevelopperサイトにてダウンロードしましょう。
xip形式でなので展開すればXcode.appファイルが出来上がります。
これをアプリケーションフォルダにドラッグすれば更新できるのですが、
そのままだとおそらく上書きされてしまうので、
一旦アプリケーションフォルダ内の古い方を Xcode_16.4.app などにしてドラッグしましょう。
これでXcodeのバージョンが異なるとエラーで怒られることはなくなるかと思います。
ただし、メジャーバージョンが同じもの(例えば26.0と26.2)を同居させた場合に、
新しい方をXcode.appとしていても古い方が検出されてしまいエラーが発生したので、
メジャーバージョンが異なる場合のみ同居可能なのかもしれません。
(一先ず古い方をゴミ箱送りにすれば動作しましたが、
 デフォルトパス設定をちゃんとすれば問題起きないのでしょうか、、、?)
また実機実行に必要なデバイスサポートファイルを新しいXcode内に格納する必要もあります。
 Xcode右クリック > パッケージの内容を表示 >
  ”Contents” > “Developer” > “Platforms” > “iPhoneOS.platform” > “DeviceSupport”
古いXcode内のDeviceSupportからコピーするのが楽かもしれません。

3. .NETのバージョンが切り替わった後や、global.jsonで.NETのバージョンを指定した後は、
プロジェクト直下でcmdを開き、以下の2コマンドを順に実行し、
sdkが意図したバージョンになることを確認しましょう。
dotnet workload restore → dotnet –version

4. .NETのバージョンを切り替えた後にiOSをビルドする場合は、
古いバージョンのビルド情報がMacに残っておりビルド失敗の原因になり得るので、
ローカルとMacそれぞれからXamarin関係のキャッシュを一度削除しましょう。
・ローカルでは以下の2フォルダがキャッシュなので削除
 %localappdata%\Temp\Xamarin\XMA
 %localappdata%\Xamarin\MonoTouch
・Macでは以下の2フォルダがキャッシュなので削除
 $HOME/Library/Caches/Xamarin/XMA
 $HOME/Library/Caches/maui/PairToMac
Macとのペアリングが成功しなくなった場合などもこれで解決することが多いです。

5. .NETのバージョンを上げた結果、ビルド時に以下のようなエラーが発生するようになりました。
(iOSシミュレータ実行時のもので、iOS実機時やAndroid時は対応する箇所の記述が異なります)
> 資産ファイル ‘D:\VSTS\Komatsu720623\Project\Mobile\KOM-MICS Mobile\obj\project.assets.json’ に ‘net10.0-ios/iossimulator-x64′ のターゲットがありません。
> 復元が実行されたこと、および ‘net10.0-ios’ がプロジェクトの TargetFrameworks に含まれていることを確認してください。プロジェクトの RuntimeIdentifiers に ‘iossimulator-x64′ を組み込む必要が生じる可能性もあります。
エラーメッセージの示唆に従ってRuntimeIdentifiersやRuntimeIdentifierにてターゲットを指定しても、
特定のターゲットのみ成功するようになることがあるだけで根本的に解決しません。
おそらくプロジェクトのキャッシュに前のターゲット情報が残っていることが原因なので、
以下のようにキャッシュを削除及びパッケージの依存関係の復元を行いましょう。
① Project直下のbinフォルダとobjフォルダを削除
② Project直下でcmdを開き、dotnet restore(※)
これにより、Androidならリビルド、iOSならMacとペアリング→リビルドにより
ビルド及び実行が成功するようになると思います。
※この dotnet restore は前述の dotnet workload restore よりも必ず後に実行してください。
 dotnet restore → dotnet workload restore の順だとビルド成功しません。

6. .NETのバージョン更新や、(MAUIは無関係ですが)Androidの要件変更により、
いくつかのパッケージの追加・更新を行う必要がありました。
今回はそれで解決したので良いのですが、
もしも保守されていないパッケージで問題が起こったら、、、と思うとぞっとします。
そう考えると依存するパッケージも極力メジャーで保守され続けるもののみにした方が良いですね。
モバイルアプリ開発はマルチプラットフォームの普及もあり一度リリースするまでは手軽ですが、
そこで終わりではなくリリースを保つためにOSやSDKのアップデートに追従して
保守し続けないといけないのが大変だと実感しました。。。

※12/25: 諸事情により記入途中です。後日追記します。
 →12/29: 追記完了しました。

何とかシミュレータ/実機共にデバッグ実行できるようになり、
またリリースビルドとストアへのアップロードも成功し一安心しました。

しかし、これで2026対応は終わりではありませんでした。
VSの社内拡張機能が動作しなくなったのです。
しかも2026だけでなく2022でも動作しません、、、
まだ調査中なのですが、次回はそれについて書こうと思います。(※↓)

それでは皆さん良いお年をお迎えください。

※ 26/2/6追記
VS2026にて一部破壊的な仕様変更が行われたようです。
社内拡張機能の処理にて、エディタを最新の状態にするために
削除→Undoにより編集イベントを発生させ最新を反映させる実装となっていたのですが、
このイベントがUndoスタックに乗らなくなり、Undoが機能しなくなっておりました。
代わりにカーソル移動により編集イベントの発生を試行するように修正し対応しました。

コメントを残す