🐵

Xamarin.Macに別れを告げ、.NETに移行した話

2023/06/21に公開

概要

Xamarinファミリーのサポート終了に伴い、.NETへの移行を検討したのですが、いかんせんXamarin.Macを使っている人が少なすぎて情報が無いので移行作業の流れを記録しておきます。

注意

今回移行対象のプロジェクトはXamarinであって、Xamarin.formsではありません。ご注意下さい。

環境

  • MacBook Pro(Apple M1 Pro)
  • macOS Monterey 12.4
  • Visual Studio Professional 2022 for Mac バージョン 17.6 (build 1575)

さて移行していこう

まずはMicrosoft公式の移行ドキュメントを見ていきます。
https://learn.microsoft.com/ja-jp/dotnet/maui/migration/native-projects
(ここにXamarin.Macという文字があるだけで、ちゃんと存在が認知されているんだと安心する。)

基本的には

  • .NETのプロジェクト作る
  • コード、リソースをまるごとコピーしてくる
  • ビルド
    といった流れで、コード変更はほぼ必要なしで移行できるようです。さすが。

まぁそんな簡単にはいかないわけで

ここで素直に丸ごとコピーして動いたら記事を書く必要はないわけでして、当然すぐには移行できませんでした。
99%コピーで移行できましたが、若干引っかかった所を書いていきます。

.NETのプロジェクトが作れない

これはVisual Studioインストール時に.NETが選択されていないことが原因です。SDKが別途インストールされていたとしても駄目なようです。(おそらくプロジェクトテンプレートがインストールされていない)
vsformacのインストーラーをダウンロードしてきて起動し、以下のようにチェックボックスを入れてインストールを進めて下さい。「他のツールセット」の中にある「macOS (Cocoa)」を選びます。

インストール完了したら新規プロジェクト作成画面で選べるようになります。.NETの方の「macOS アプリケーション」で作成します。

NuGetパッケージが復元されない

これは多分かなり前に変わっていたと思うのですが、package.configではなくcsprojの中にNuGetパッケージに関する情報が記載されるようになったので、csprojをエディターで開いてパッケージ情報を移行する必要があります。書式が違うので注意して下さい。

package.config

<packages>
  <package id="MessagePack" version="2.5.108"/>
</packages>

.csproj

<Project Sdk="Microsoft.NET.Sdk">
  <ItemGroup>
    <PackageReference Include="MessagePack" Version="2.5.108" />
  </ItemGroup>
</Project>

非推奨メソッドの変更

これは仕方ないですが、Xamarinから移行する関係でいくつか非推奨メソッドになっていたので修正しました。この辺りは引数の型が変わっていたり、メソッド名が変わって移行のアナウンスがあったのでそのまま変更しました。

破壊的変更の確認

各.NETにおいて破壊的変更がアナウンスされています。必ず確認しましょう。
https://learn.microsoft.com/ja-jp/dotnet/core/compatibility/8.0

アプリに署名ができない

以前はプロジェクト設定画面に「Mac署名」という欄があってそこで設定ができたのですが、.NETに移行したら設定欄ごとなくなりました。なのでcsprojを編集して直接書き込みました。EnableCodeSigningをTrueにして、CodeSigningKeyに証明書の情報を持ってきます。移行前のcsprojを開いて該当箇所をコピーしてくるのが確実です。

AssemblyInfoの内容が重複する

.NET 6移行はcsprojの中に記述する方式に変わったので必要な項目をコピーする。

まとめ

正直、ここまで互換性を維持してるのはびっくりしました。Xamarin.Macだしもっと苦労するだろうなぁーと思っていたのですが、さすがMicrosoft。ちなみにStoryBoardの他、xibも移行したのですがちゃんと動きました。
基本的にはcsprojを新規で作り直して丸ごとコードをコピペして持ってこれば移行完了です。後はNuGetパッケージの書式を変更し、非推奨メソッドがあれば修正といった感じです。

この記事が誰かの役に立つ事を祈って。

Discussion