コードの共有の概要

このドキュメントでは、クロスプラットフォーム プロジェクト間でコードを共有するさまざまな方法 (.NET Standard、共有プロジェクト、ポータブル クラス ライブラリ) をそれぞれの長所と短所を含め比較します。

クロスプラットフォーム アプリケーション間でコードを共有するには以下の 3 つの方法があります。

  • .NET Standard ライブラリ – .NET Standard プロジェクトでは、複数のプラットフォーム間で共有されるコードを実装でき、(バージョンに応じて) 多数の .NET API にアクセスできます。 .NET Standard 1.0 から 1.6 で実装されている API のセットは段階的に大きくなっていますが、.NET Standard 2.0 は (Xamarin アプリで使用できる .NET API を含む) .NET BCL の最適なカバレッジを提供しています。
  • 共有プロジェクト – 共有アセット プロジェクト タイプを使用してソース コードを整理し、プラットフォーム固有の要件を管理する必要に応じて #if コンパイラ ディレクティブを使用します。
  • ポータブル クラス ライブラリ (非推奨) – ポータブル クラス ライブラリ (PCL) は、共通の API サーフェイスを持つ複数のプラットフォームをターゲットにし、インターフェイスを使用してプラットフォーム固有の機能を提供できます。 PCL は、Visual Studio の最新バージョンでは非推奨です。代わりに .NET Standard を使用してください。

コード共有戦略の目的は、この図に示されているように、1 つのコードベースを複数のプラットフォームが利用できるアーキテクチャをサポートすることです。

Shared code application architecture

この記事では、利用可能な方法を比較して、アプリケーションに適したプロジェクト タイプを選択するのを手助けします。

.NET Standard ライブラリ

.NET Standard ライブラリには、Xamarin.Android や Xamarin.iOS などのクロスプラットフォーム プロジェクトを含め、さまざまなプロジェクトの種類で参照できる、well-defined な基本クラス ライブラリのセットが用意されています。 既存の .NET Framework コードとの互換性を最大限に高めるには、.NET Standard 2.0 が推奨されます。

.NET Standard diagram

メリット

  • 複数のプロジェクト間でのコードの共有が可能になります。
  • リファクタリング操作では、影響を受けるすべての参照が常に更新されます。
  • PCL プロファイルよりも大きい .NET 基本クラス ライブラリ (BCL) のサーフェイス領域を利用できます。 特に、.NET Standard 2.0 は .NET Framework とほぼ同じ API サーフェイスを備え、新しいアプリや既存の PCL の移植に推奨されます。

短所

  • #if __IOS__ のようなコンパイラ ディレクティブを使用できません。

解説

.NET Standard は PCL に類似していますが、より単純なプラットフォーム サポートのためのモデルと、より多くの BCL 由来のクラスを持ちます。

共有プロジェクト

共有プロジェクトは、それらを参照するすべてのプロジェクトに含まれるコード ファイルとアセットを含んでいます。 共有プロジェクトは、単独ではコンパイルされた出力を生成しません。

次のスクリーンショットは、共通の C# ソース コード ファイルを含む Shared プロジェクトを持つ (Android、iOS、および Windows 用の) 3 つのアプリケーション プロジェクトを含むソリューション ファイルを示しています。

Shared project solution

次の図に示されているのは概念アーキテクチャであり、各プロジェクトはすべての共有ソース ファイルを含んでいます。

Shared project diagram

iOS、Android、Windows をサポートするクロスプラットフォーム アプリケーションには、プラットフォームごとにアプリケーション プロジェクトが必要になります。 共通コードは、共有プロジェクト内に存在します。

例となるソリューションには、以下のフォルダーとプロジェクトが含まれることになります (プロジェクト名は分かりやすいように選択されています。実際のプロジェクトでは以下の名前付けガイドラインに従う必要はありません)。

  • Shared – すべてのプロジェクトに共通のコードを含む共有プロジェクト。
  • AppAndroid – Xamarin.Android アプリケーション プロジェクト。
  • AppiOS – Xamarin.iOS アプリケーション プロジェクト。
  • AppWindows – Windows アプリケーション プロジェクト。

このようにして、3 つのアプリケーション プロジェクトが同じソース コード (Shared 内の C# ファイル) を共有しています。 共有コードに対するどんな編集も、3 つのプロジェクトすべてで共有されます。

メリット

  • 複数のプロジェクト間でのコードの共有が可能になります。
  • 共有コードは、コンパイラ ディレクティブを使用してプラットフォームに基づいて分岐できます (クロス プラットフォーム アプリケーションの構築ドキュメントで説明されているように、たとえば #if __ANDROID__ を使用します)。
  • アプリケーション プロジェクトには、共有コードで利用できるプラットフォーム固有の参照を含めることができます (Windows Phone の Tasky サンプルでの Community.CsharpSqlite.WP7 の使用など)。

短所

  • 'inactive' コンパイラ ディレクティブ内のコードに影響を与えるリファクタリングでは、それらのディレクティブ内のコードは更新されません。
  • 他のほとんどのプロジェクト タイプとは異なり、共有プロジェクトには 'output' アセンブリはありません。 コンパイル中、ファイルは参照元プロジェクトの一部として扱われ、そのアセンブリ内へコンパイルされます。 コードをアセンブリとして共有したい場合は、.NET Standard またはポータブル クラス ライブラリの方が優れたソリューションとなります。

解説

自分のアプリ内で共有することのみを目的とした (他の開発者には配布しない) コードを記述するアプリケーション開発者にとって優れたソリューションです。

ポータブル クラス ライブラリ

ヒント

ポータブル クラス ライブラリよりも .NET Standard 2.0 ライブラリが推奨されます。

ポータブル クラス ライブラリについては、こちらで詳しく説明されています

Portable class library diagram

メリット

  • 複数のプロジェクト間でのコードの共有が可能になります。
  • リファクタリング操作では、影響を受けるすべての参照が常に更新されます。

短所

  • Visual Studio の最新バージョンでは非推奨となっており、代わりに .NET Standard ライブラリが推奨されます。 PCL と .NET Standard に関しては、こちらの違いの説明を参照してください。
  • コンパイラ ディレクティブを使用できません。
  • 選択したプロファイルによって決まる .NET フレームワークのサブセットしか使用できません (詳細については、「PCL の概要」を参照してください)。

解説

PCL テンプレートは、最新バージョンの Visual Studio では非推奨と見なされています。

まとめ

選択するコード共有戦略は、対象とするプラットフォームによって決まります。 自分のプロジェクトに最適な方法を選択してください。

.NET Standard は、共有可能なコード ライブラリを構築するための最適な選択肢です (特に NuGet での公開)。 共有プロジェクトは、クロスプラットフォーム アプリで多数のプラットフォーム固有機能を使用する予定であるアプリケーション開発者に適しています。

PCL プロジェクトは引き続き Visual Studio でサポートされますが、新しいプロジェクトには .NET Standard が推奨されます。