Xamarin.Androidを.NET6に移行する方法について。

.NET MAUIアドベントカレンダー2021の18日目です。
@MAUIHighSchool さん。1日目から毎日更新ありがとうございます。

今年もアドベントカレンダーの時期がやってきました。
何か書きたいと思ったのですが、今年はXamarinのアドベントカレンダーが見つかりません。
XamarinはMAUIの先祖ですので、MAUIアドベントカレンダーに投稿させていただきます。

# Xamarinサポート終了！
Xamarinは2025年5月1日でサポート終了することがアナウンスされています。
はじめこのニュースを聞いたとき、Xamarin.Androidは将来、使用できなくなるのかと思いましたが、正しくは、

* Xamarin.Formsは「MAUI」に引き継がれる。
* Xamarin.AndroidやXamarin.iOSなどは、.NET6の一部となり、今後も使用できる。

ということです

Xamarin.FormsをMAUIに移行する情報はよく見かけるのですが、
Xamarin.Androidを.NET6に移行する情報は、あまり見かけないように思います。
そこで、今回調べた結果をまとめてみようと思います。

# Visual Studio 2022では、Xamarinのインストールは「オプション」になっています。
デフォルトではオフになっており、オンにしないとインストールされません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245196/4e2b2fb0-8043-4fb2-f66c-a3f7828f4190.png)

ただ、先ほども言ったように、Xamarin.Androidは.NET6の一部となっているので、インストールしなくとも、従来のXamarin.Androidに相当する「C#でAndroidのネイティブアプリ開発」は実行できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245196/a89dc1c9-b123-02e2-2eaa-0a99f49fe97a.png)

新しいプロジェクト作成時、オレンジ枠の「Androidアプリ（Xamarin)」が従来のXamarin.Androidアプリで、みどり枠の「Androidアプリケーション」が今回の.NET6用Androidアプリのようです。当然、オレンジ枠は、Xamarinをインストールしないと、表示されません。

## 作成されたソースコードも少し違います。
まずはオレンジ枠の「Androidアプリ（Xamarin)」の場合。

```c#
using Android.App;
using Android.OS;
using Android.Runtime;
using AndroidX.AppCompat.App;

namespace XamarinAndroidApp
{
    [Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)]
    public class MainActivity : AppCompatActivity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.activity_main);
        }
        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
        {
            Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
}
```

こんどは、みどり枠の「Androidアプリケーション」の場合。

```c#
namespace DotNetAndroidApp
{
    [Activity(Label = "@string/app_name", MainLauncher = true)]
    public class MainActivity : Activity
    {
        protected override void OnCreate(Bundle? savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.activity_main);
        }
    }
}
```

usingはglobal usingに移動したようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245196/6c99f0bb-8c51-49e8-00f7-0eb6276d7091.png)

# Xamarin.Androidプロジェクトを.NET6に移行するには

このことを詳細に説明したページが以下の場所にありました。

https://github.com/xamarin/xamarin-android/wiki/Migrating-Xamarin.Android-Applications-to-.NET-6

意訳すると

* Xamarin.Androidは.NET6の一部となる。
* これにより、他の膨大な.NETライブラリが利用できたり、.NET6によるパフォーマンス改善などのメリットがある。
* しかし、移行のために、若干の作業が必要。
* 互換性には最善の注意を払っており、ほとんどコードを変更する必要はないと予想される。
* 作業の大部分は、プロジェクトファイルを「新しいSDKスタイル」に置き換えること。

その具体的な方法としては、

1. try-convertというツールを使う。
1. dotnetのupgrade-assistantに、Xamarin移行サポートを準備中。（まだ利用できないようです）
1. Visual Studio 2022の新しいAndroidテンプレートでプロジェクトを作成して、必要なファイルをコピーする。
1. 直接、「.csproj」ファイルを編集する。

try-convertは、コマンドラインで実行するツール（dotnetのグローバルツール）で、
Visual Studioのプロジェクトファイルを、以前の形式のものから、新しいSDKスタイルに変換するツールです。

https://github.com/dotnet/try-convert

導入するには、コマンドラインから、以下のコマンドを実行するだけです。

```
> try-convert tool install -g try-convert
```

実行するには、以下のように実行します。

```
> try-convert -w 'ソリューションファイルが入っているフォルダへのパス'
```

さっそく実行してみましょう。

```
> try-convert -w source\repos\XamarinAndroidApp
```

あらら？例外「InvalidProjectFileException」が発生しました。
スタックトレースによると「Xamarin.Android.CSharp.targets」というファイルが見つからないのが原因のようです。

PCを変えたり環境を変えたり試しましたが、どうしてもうまくいきませんでした。
私の環境だけかもしれませんが、どうやら、面倒でも、3の方法で地道に移行するしかないようです。

# まとめ
* 今後、C#でAndroidアプリを新規開発するには、新しい「Androidアプリケーション」テンプレートを選択して開発すればよい。
* 既存のXamarin.Androidプロジェクトを.NET6に移行するには、現時点ではよい方法が無く、新たに「Androidアプリケーション」を作成して、手動で必要なファイルをコピーするしかない。

以上です。