.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のインストールは「オプション」になっています。
デフォルトではオフになっており、オンにしないとインストールされません。
ただ、先ほども言ったように、Xamarin.Androidは.NET6の一部となっているので、インストールしなくとも、従来のXamarin.Androidに相当する「C#でAndroidのネイティブアプリ開発」は実行できます。
新しいプロジェクト作成時、オレンジ枠の「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に移動したようです。
Xamarin.Androidプロジェクトを.NET6に移行するには
このことを詳細に説明したページが以下の場所にありました。
意訳すると
- Xamarin.Androidは.NET6の一部となる。
- これにより、他の膨大な.NETライブラリが利用できたり、.NET6によるパフォーマンス改善などのメリットがある。
- しかし、移行のために、若干の作業が必要。
- 互換性には最善の注意を払っており、ほとんどコードを変更する必要はないと予想される。
- 作業の大部分は、プロジェクトファイルを「新しいSDKスタイル」に置き換えること。
その具体的な方法としては、
- try-convertというツールを使う。
- dotnetのupgrade-assistantに、Xamarin移行サポートを準備中。(まだ利用できないようです)
- Visual Studio 2022の新しいAndroidテンプレートでプロジェクトを作成して、必要なファイルをコピーする。
- 直接、「.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アプリケーション」を作成して、手動で必要なファイルをコピーするしかない。
以上です。