クロスプラットフォームでのコード共有方法
Xamarin.Forms の開発では、クロスプラットフォーム間でコード共有するには、以下の3つの方法があります。
- .NET Standard ライブラリ
- 共有プロジェクト
- ポータブルクラスライブラリ(PCL)
少し詳しく見てみましょう。
.NET Standard
引用:共有コードの概要 - Xamarinより
.NET Standard は現在一番推奨される方法で、バージョンにはよるものの非常に多くの .NET API にアクセスできます。
また、.NET Standard は Xamarin.iOS, Xamarin.Android などのクロスプラットフォームのプロジェクトから参照することが可能です。
.NET Standard は PCL と似ていますが、PCL より単純なモデルで多くの BCL のクラスを扱えるため、PCL より推奨されます。
PCL では各プラットフォームで別バージョンの BCL が存在していて複雑になっていたのですが、.NET Standard では 各プラットフォームの BCL が .NET Standard に準拠することでシンプルなモデルになっています。
共有プロジェクト
引用:共有コードの概要 - Xamarinより
共有プロジェクトは、コードベースでクロスプラットフォーム間のコード共有を実現します。
コードベースとは、コンパイル時に共有プロジェクトのソースコードのファイルを、各プラットフォームのプロジェクトに読み込むことで、コードを共有します。(間違ってたら教えてください)
その際、#if __ANDROID__ といったコンパイルディレクティブを使用することで、共有ソースコード内でプラットフォームごとの処理を切り分けることができます。
なお、共有プロジェクトはファイルベースのコード共有方法のため、NuGet や DLL といった方法でコードの共有はできません。他のプロジェクトで使用するためには、ファイルをコピーする必要があります。
ポータブルクラスライブラリ(PCL)
引用:共有コードの概要 - Xamarinより
PCL は最新バージョンでは非推奨となっており、.NET Standard を使用することが推奨されています。
PCL は .NET Standard と同様に、Xamarin.iOS, Xamarin.Android などのクロスプラットフォームのプロジェクトから参照することが可能です。
ですが、PCL にはプロファイルというものがあり、複雑なバージョン体系になっています。
そのため、PCL で作成したプロジェクトを他のプロジェクトから参照するのに、バージョン互換の面で制約が起きてしまうというデメリットがあります。
まとめ
まとめてしまうと、クラスプラットフォームのコード共有は .NET Standard を使いましょうということになります。
共有プロジェクトを使ったほうがよいという記事を見かけましたが、Microsot が .NET Standard を推奨し、そちらにかじを切っている以上、特別な理由がなければ .NET Standard を採用した方が幸せな道ではないでしょうか。
2017年12月時点では、.NET Standard が登場したことが間もないということで共有プロジェクトが推奨されたこともあるようですが、現在は公式ドキュメントも推奨してますので、.NET Standard を採用することが妥当だと思われます。
あと、.NET Standard は比較的新しい仕組みであるため、ネットでも PCL vs Shared Project という古い記事が結構あるので(英語を含む)、混乱しないようご注意ください。
参考サイト
- 共有コードの概要 - Xamarin | Microsoft Docs
- Xamarin で使う .NET Standard ライブラリ/PCL(Portable Class Library)/Shared Project について - Xamarin 日本語情報