10
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Posted at

.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

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

image.png

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

作成されたソースコードも少し違います。

まずはオレンジ枠の「Androidアプリ(Xamarin)」の場合。

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アプリケーション」の場合。

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

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

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

意訳すると

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

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

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

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

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

> 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アプリケーション」を作成して、手動で必要なファイルをコピーするしかない。

以上です。

10
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?