共有コードの概要

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

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

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

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

Shared code application architecture

この記事では、アプリケーションに適したプロジェクトの種類を選択するのに役立つメソッドを比較します。

.NET Standard ライブラリ

.NET Standard ライブラリには、Xamarin.Android や Xamarin.iOS などのクロスプラットフォーム プロジェクトなど、さまざまなプロジェクトの種類で参照できる、明確に定義された基本クラス ライブラリのセットが用意されています。 既存の.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 のクラスの数が多くなります。

共有プロジェクト

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

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

Shared project solution

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

Shared project diagram

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

ソリューションの例には、次のフォルダーとプロジェクトが含まれます (プロジェクト名は表現力を高めるために選択されています。プロジェクトはこれらの名前付けガイドラインに従う必要はありません)。

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

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

メリット

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

短所

  • "非アクティブ" コンパイラ ディレクティブ内のコードに影響を与えるリファクタリングでは、それらのディレクティブ内のコードは更新されません。
  • 他のほとんどのプロジェクトの種類とは異なり、共有Projectには '出力' アセンブリはありません。 コンパイル中、ファイルは参照元プロジェクトの一部として扱われ、そのアセンブリにコンパイルされます。 コードをアセンブリとして共有する場合は、.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 をお勧めします。