ポータブル クラス ライブラリ (PCL)Portable Class Libraries (PCL)

ヒント

ポータブル クラス ライブラリ (PCL) は、最新バージョンの Visual Studio。Portable Class Libraries (PCLs) are considered deprecated in the latest versions of Visual Studio. PCL は引き続き開き、編集、コンパイルすることができますが、新しいプロジェクトの場合は、.NET Standard ライブラリを使用して、より大きな API サーフェス領域にアクセスする方法をお勧めします。While you can still open, edit, and compile PCLs, for new projects it is recommended to use .NET Standard libraries to access a larger API surface area.

クロスプラットフォーム アプリケーションを構築する重要なコンポーネントは、さまざまなプラットフォーム固有のプロジェクト間でコードを共有できる場合です。A key component of building cross-platform applications is being able to share code across various platform-specific projects. ただし、多くの場合、異なるプラットフォームで .NET 基本クラス ライブラリ (BCL) の異なるサブセットが使用されるため、実際には別の .NET Core ライブラリ プロファイルにビルドされるため、これは複雑です。However, this is complicated by the fact that different platforms often use a different sub-set of the .NET Base Class Library (BCL), and therefore are actually built to a different .NET Core Library Profile. つまり、各プラットフォームでは、同じプロファイルを対象とするクラス ライブラリのみを使用できます。そのため、プラットフォームごとに個別のクラス ライブラリ プロジェクトが必要と見なされます。This means that each platform can only use class libraries that are targeted to the same profile so they would appear to require separate class library projects for each platform.

この問題に対処するコード共有には、.NET Standard プロジェクト、共有資産プロジェクト、およびポータブルクラス ライブラリ (PCL) プロジェクトの 3 つの主要な方法があります。There are three major approaches to code sharing that address this problem: .NET Standard projects, Shared Asset Projects, and Portable Class Library (PCL) projects.

  • .NET Standard.NET コード を共有するための推奨されるアプローチは、プロジェクトと Xamarin の.NET Standard を参照してください.NET Standard projects are the preferred approach for sharing .NET code, read more about .NET Standard projects and Xamarin.
  • 共有資産 プロジェクトでは、単一のファイル セットが使用され、ソリューション内でコードを共有する簡単な方法が提供され、一般に条件付きコンパイル ディレクティブを使用して、それを使用するさまざまなプラットフォームのコード パスを指定します (詳細については、共有プロジェクトに関する記事を参照 してください)。Shared Asset Projects use a single set of files and offers a quick and simple way in which to share code within a solution and generally employs conditional compilation directives to specify code paths for various platforms that will use it (for more information see the Shared Projects article).
  • PCL プロジェクト は、BCL クラス/機能の既知のセットをサポートする特定のプロファイルを対象とします。PCL projects target specific profiles that support a known set of BCL classes/features. ただし、PCL に対するダウンサイドは、プロファイル固有のコードを独自のライブラリに分離するために、多くの場合、追加のアーキテクチャ作業が必要です。However, the down side to PCL is that they often require extra architectural effort to separate profile specific code into their own libraries.

このページでは、特定のプロファイルを対象とする PCL プロジェクトを作成する方法について説明します。このプロジェクトは、複数のプラットフォーム固有のプロジェクトで参照できます。This page explains how to create a PCL project that targets a specific profile, which can then be referenced by multiple platform-specific projects.

ポータブル クラス ライブラリとはWhat is a Portable Class Library?

Application Project または Library Projectを作成すると、生成される DLL は、作成対象の特定のプラットフォームでの作業に制限されます。When you create an Application Project or a Library Project, the resulting DLL is restricted to working on the specific platform it is created for. これにより、Windows アプリ用のアセンブリを記述した後、Xamarin.iOS と Xamarin.Android でアセンブリを再使用する必要が生じかねない。This prevents you from writing an assembly for a Windows app, and then re-using it on Xamarin.iOS and Xamarin.Android.

ただし、ポータブル クラス ライブラリを作成する場合は、コードを実行するプラットフォームの組み合わせを選択できます。When you create a Portable Class Library, however, you can choose a combination of platforms that you want your code to run on. ポータブル クラス ライブラリを作成するときに行う互換性の選択は、ライブラリがサポートするプラットフォームを記述する "プロファイル" 識別子に変換されます。The compatibility choices you make when creating a Portable Class Library are translated into a “Profile” identifier, which describes which platforms the library supports.

次の表は、.NET プラットフォームによって異なる機能の一部を示しています。The table below shows some of the features that vary by .NET platform. 特定のデバイスまたはプラットフォームで実行が保証される PCL アセンブリを作成するには、プロジェクトの作成時に必要なサポートを選択します。To write a PCL assembly that is guaranteed to run on specific devices/platforms you simply choose which support is required when you create the project.

機能Feature .NET Framework.NET Framework UWP アプリUWP apps SilverlightSilverlight Windows PhoneWindows Phone XamarinXamarin
コアCore YY YY YY YY YY
LINQLINQ YY YY YY YY YY
IQueryableIQueryable YY YY YY 7.5 +7.5 + YY
シリアル化Serialization YY YY YY YY YY
データの注釈Data Annotations 4.0.3 +4.0.3 + YY YY YY

Xamarin 列には、Xamarin.iOS と Xamarin.Android が Visual Studio に含むすべてのプロファイルをサポートし、作成するライブラリの機能の可用性は、サポートする他のプラットフォームによってのみ制限されるという事実が反映されています。The Xamarin column reflects the fact that Xamarin.iOS and Xamarin.Android supports all the profiles shipped with Visual Studio, and the availability of features in any libraries you create will only be limited by the other platforms you choose to support.

これには、次の組み合わせであるプロファイルが含まれます。This includes profiles that are combinations of:

  • .NET 4 または .NET 4.5.NET 4 or .NET 4.5
  • Silverlight 5Silverlight 5
  • Windows Phone 8Windows Phone 8
  • UWP アプリUWP apps

Microsoftの Web サイトでさまざまなプロファイルの機能の詳細を確認し、サポートされているフレームワーク情報や他の注意事項を含む別のコミュニティ メンバーのPCLプロファイルの概要を確認できます。You can read more about the different profiles' capabilities on Microsoft’s website and see another community member's PCL profile summary which includes supported framework info and other notes.

メリットBenefits

  1. 一元化されたコード共有 – 他のライブラリやアプリケーションで使用できるコードを 1 つのプロジェクトに記述してテストします。Centralized code sharing – write and test code in a single project that can be consumed by other libraries or applications.
  2. リファクタリング操作は、ソリューションに読み込まれるすべてのコード (ポータブル クラス ライブラリとプラットフォーム固有のプロジェクト) に影響します。Refactoring operations will affect all code loaded in the solution (the Portable Class Library and the platform-specific projects).
  3. PCL プロジェクトは、ソリューション内の他のプロジェクトから簡単に参照できます。または、出力アセンブリを他のユーザーがソリューションで参照するために共有できます。The PCL project can be easily referenced by other projects in a solution, or the output assembly can be shared for others to reference in their solutions.

短所Disadvantages

  1. 同じポータブル クラス ライブラリが複数のアプリケーション間で共有されている場合、プラットフォーム固有のライブラリを参照することはできません (例:Because the same Portable Class Library is shared between multiple applications, platform-specific libraries cannot be referenced (eg. Community。CsharpSqlite.WP7)。Community.CsharpSqlite.WP7).
  2. ポータブル クラス ライブラリのサブセットには、MonoTouch と Mono for Android の両方で使用できるクラス (DllImport や System.IO.File など) が含まれる場合があります。The Portable Class Library subset may not include classes that would otherwise be available in both MonoTouch and Mono for Android (such as DllImport or System.IO.File).

注意

ポータブル クラス ライブラリは最新バージョンの Visual Studio では非推奨とされており、代.NET Standardライブラリをお勧めします。Portable Class Libraries have been deprecated in the latest version of Visual Studio, and .NET Standard Libraries are recommended instead.

プロバイダー パターンまたは依存関係の挿入を使用して、プラットフォーム プロジェクトの実際の実装をポータブル クラス ライブラリで定義されているインターフェイスまたは基本クラスに対してコード化するには、ある程度両方の欠点を回避できます。To some extent both disadvantages can be circumvented using the Provider pattern or Dependency Injection to code the actual implementation in the platform projects against an interface or base class that is defined in the Portable Class Library.

次の図は、ポータブル クラス ライブラリを使用してコードを共有するクロスプラットフォーム アプリケーションのアーキテクチャを示しています。また、依存関係の挿入を使用してプラットフォームに依存する機能を渡します。This diagram shows the architecture of a cross-platform application using a Portable Class Library to share code, but also using Dependency Injection to pass in platform-dependent features:

この図は、ポータブル クラス ライブラリを使用してコードを共有し、依存関係の挿入を使用してプラットフォームに依存する機能を渡すクロスプラットフォーム アプリケーションのアーキテクチャを示していますThis diagram shows the architecture of a cross-platform application using a Portable Class Library to share code, but also using Dependency Injection to pass in platform-dependent features

Visual Studio for MacチュートリアルVisual Studio for Mac walkthrough

このセクションでは、 を使用してポータブル クラス ライブラリを作成および使用する方法についてVisual Studio for Mac。This section walks through how to create and use a Portable Class Library using Visual Studio for Mac. 完全な実装については、「PCL の例」セクションを参照してください。Refer the to PCL Example section for a complete implementation.

PCL の作成Creating a PCL

ポータブル クラス ライブラリをソリューションに追加する方法は、通常のライブラリ プロジェクトの追加と非常に似ています。Adding a Portable Class Library to your solution is very similar to adding a regular Library project.

  1. [新しい ライブラリProject ダイアログで 、[Multiplatform > Library > ポータブル ライブラリ] オプションを選択します。In the New Project dialog select the Multiplatform > Library > Portable Library option:

    新しい PCL プロジェクトを作成する

  2. PCL が Visual Studio for Macされると、Xamarin.iOS と Xamarin.Android に対して機能するプロファイルで自動的に構成されます。When a PCL is created in Visual Studio for Mac it is automatically configured with a Profile that works for Xamarin.iOS and Xamarin.Android. 次のスクリーンショットに示すように、PCL プロジェクトが表示されます。The PCL project will appear as shown in this screenshot:

    ソリューション パッドの PCL プロジェクト

これで、PCL はコードを追加する準備ができました。The PCL is now ready for code to be added. また、他のプロジェクト (アプリケーション プロジェクト、ライブラリ プロジェクト、その他の PCL プロジェクト) でも参照できます。It can also be referenced by other projects (Application projects, Library projects and even other PCL projects).

PCL 設定の編集Editing PCL settings

このプロジェクトの PCL 設定を表示および変更するには、プロジェクトを右クリックし、[オプション] > [ビルド] > 全般 ] を選択して、次の画面を表示します。To view and change the PCL settings for this project, right-click the project and choose Options > Build > General to see the screen shown here:

PCL Projectプロファイルを設定するためのオプションPCL Project Options to set the profile

[ 変更...] をクリック して、このポータブル クラス ライブラリのターゲット プロファイルを変更します。Click Change... to alter the target profile for this portable class library.

コードが既に PCL に追加された後にプロファイルが変更された場合、新しく選択したプロファイルの一部ではない機能をコードが参照している場合、ライブラリがコンパイルされなくなる可能性があります。If the profile is changed after code has already been added to the PCL, it's possible that the library will no longer compile if the code references features that are not part of the newly-selected profile.

PCL の操作Working with a PCL

PCL ライブラリでコードを記述すると、Visual Studio for Mac エディターは選択したプロファイルの制限を認識し、必要に応じてオートコンプリート オプションを調整します。When code is written in a PCL library, the Visual Studio for Mac editor will recognize the limitations of the selected profile and adjust auto-complete options accordingly. たとえば、このスクリーンショットは、Visual Studio for Mac で使用される既定のプロファイル (Profile136) を使用して System.IO のオートコンプリート オプションを示しています。使用可能なクラスの約半分が表示されるスクロール バーに注目してください (実際には、使用可能なクラスは 14 クラスのみです)。For example, this screenshot shows the auto-complete options for System.IO using the default profile (Profile136) used in Visual Studio for Mac – notice the scrollbar which indicates about half of the available classes are displayed (in fact there are only 14 classes available).

PCL の System.IO クラスの Intellisense リストIntellisense list of 14 classes in the System.IO class of a PCL

Xamarin.iOS または Xamarin.Android プロジェクトの System.IO オートコンプリートと比較します。一般的に使用される クラス File (PCL プロファイルに 含めて、 や など) を含め、40 個のクラスを使用できます。 DirectoryCompare that with the System.IO auto-complete in a Xamarin.iOS or Xamarin.Android project – there are 40 classes available including commonly used classes like File and Directory which are not in any PCL profile.

名前空間内の 40 クラスの Intellisense .NET Framework System.IO 一覧Intellisense list of 40 classes in .NET Framework System.IO namespace

これは、PCL の使用に関する基礎となるトレードオフを反映しています。多くのプラットフォーム間でコードをシームレスに共有する機能は、可能なすべてのプラットフォームで同等の実装を持たないので、特定の API を使用できないという意味です。This reflects the underlying trade-off of using PCL – the ability to share code seamlessly across many platforms means certain APIs are not available to you because they don’t have comparable implementations across all possible platforms.

PCL の使用Using PCL

PCL プロジェクトが作成されると、通常参照を追加するのと同じ方法で、互換性のあるアプリケーションまたはライブラリ プロジェクトからそのプロジェクトへの参照を追加できます。Once a PCL project has been created, you can add a reference to it from any compatible Application or Library project in the same way you normally add references. 次Visual Studio for Mac参照] ノードを右クリックし、[参照の編集 ...] を選択し、次に示すように [プロジェクト]タブに 切り替えます。In Visual Studio for Mac, right-click on the References node and choose Edit References... then switch to the Projects tab as shown:

[参照の編集] オプションを使用して PCL への参照を追加するAdd a reference to a PCL via Edit References option

次のスクリーンショットは、TaskyPortable サンプル アプリのソリューション パッドを示しています。下部には PCL ライブラリが表示され、Xamarin.iOS プロジェクトの PCL ライブラリへの参照が示されています。The following screenshot shows the Solution pad for the TaskyPortable sample app, showing the PCL library at the bottom and a reference to that PCL library in the Xamarin.iOS project.

PCL プロジェクトを示す TaskyPortable サンプル ソリューションTaskyPortable sample solution showing PCL project

PCL からの出力 (つまり、結果のアセンブリ DLL) は、ほとんどのプロジェクトへの参照として追加できます。The output from a PCL (ie. the resulting assembly DLL) can also be added as a reference to most projects. これにより、PCL はクロスプラットフォーム のコンポーネントとライブラリを出荷するための理想的な方法です。This makes PCL an ideal way to ship cross-platform components and libraries.

PCL の例PCL example

TaskyPortable サンプル アプリケーションは、ポータブル クラス ライブラリを Xamarin で使用する方法を示しています。The TaskyPortable sample application demonstrates how a Portable Class Library can be used with Xamarin. iOS と Android で実行されている結果のアプリのスクリーンショットを次に示します。Here are some screenshots of the resulting apps running on iOS and Android:

iOS、Android、およびアプリで実行されている結果のアプリのスクリーンショットを次に示Windows PhoneHere are some screenshots of the resulting apps running on iOS, Android and Windows Phone

純粋に移植可能なコードである多くのデータクラスとロジック クラスを共有し、SQLite データベースの実装に依存関係の挿入を使用してプラットフォーム固有の要件を組み込む方法も示します。It shares a number of data and logic classes that are purely portable code, and it also demonstrates how to incorporate platform-specific requirements using Dependency Injection for the SQLite database implementation.

ソリューション構造を次に示します (それぞれ Visual Studio for Mac と Visual Studio)。The solution structure is shown below (in Visual Studio for Mac and Visual Studio respectively):

ソリューション構造は、それぞれ Visual Studio for Mac と Visual Studioに示されていますThe solution structure is shown here in Visual Studio for Mac and Visual Studio respectively

SQLite-NET コードには、デモンストレーションのためにプラットフォーム固有の部分 (各オペレーティング システム上の SQLite 実装を操作するために) が含まれています。そのため、ポータブル クラス ライブラリにコンパイルできる抽象クラスにリファクタリングされ、実際のコードは iOS および Android プロジェクトでサブクラスとして実装されています。Because the SQLite-NET code has platform-specific pieces (to work with the SQLite implementations on each different operating system) for demonstration purposes it has been refactored into an abstract class that can be compiled into a Portable Class Library, and the actual code implemented as subclasses in the iOS and Android projects.

TaskyPortableLibraryTaskyPortableLibrary

ポータブル クラス ライブラリは、サポートできる .NET 機能で制限されています。The Portable Class Library is limited in the .NET features that it can support. 複数のプラットフォームで実行するためにコンパイルされます。SQLite-NET で使用される機能 [DllImport] を利用することはできません。Because it is compiled to run on multiple platforms, it cannot make use of [DllImport] functionality that is used in SQLite-NET. 代わりに、SQLite-NET は抽象クラスとして実装され、残りの共有コードを介して参照されます。Instead SQLite-NET is implemented as an abstract class, and then referenced through the rest of the shared code. 抽象 API の抽出を次に示します。An extract of the abstract API is shown below:

public abstract class SQLiteConnection : IDisposable {

    public string DatabasePath { get; private set; }
    public bool TimeExecution { get; set; }
    public bool Trace { get; set; }
    public SQLiteConnection(string databasePath) {
         DatabasePath = databasePath;
    }
    public abstract int CreateTable<T>();
    public abstract SQLiteCommand CreateCommand(string cmdText, params object[] ps);
    public abstract int Execute(string query, params object[] args);
    public abstract List<T> Query<T>(string query, params object[] args) where T : new();
    public abstract TableQuery<T> Table<T>() where T : new();
    public abstract T Get<T>(object pk) where T : new();
    public bool IsInTransaction { get; protected set; }
    public abstract void BeginTransaction();
    public abstract void Rollback();
    public abstract void Commit();
    public abstract void RunInTransaction(Action action);
    public abstract int Insert(object obj);
    public abstract int Update(object obj);
    public abstract int Delete<T>(T obj);

    public void Dispose()
    {
        Close();
    }
    public abstract void Close();

}

共有コードの残りの部分では、抽象クラスを使用して、データベースからオブジェクトを "格納" および "取得" します。The remainder of the shared code uses the abstract class to “store” and “retrieve” objects from the database. この抽象クラスを使用するアプリケーションでは、実際のデータベース機能を提供する完全な実装を渡す必要があります。In any application that uses this abstract class we must pass in a complete implementation that provides the actual database functionality.

TaskyAndroid と TaskyiOSTaskyAndroid and TaskyiOS

iOS および Android アプリケーション プロジェクトには、ユーザー インターフェイスと、PCL 内の共有コードを接続するために使用されるその他のプラットフォーム固有のコードが含まれています。The iOS and Android application projects contain the user-interface and other platform-specific code used to wire-up the shared code in the PCL.

これらのプロジェクトには、そのプラットフォームで動作する抽象データベース API の実装も含まれています。These projects also contain an implementation of the abstract database API that works on that platform. iOS および Android では、Sqlite データベース エンジンはオペレーティング システムに組み込みなので、次に示すように を使用して、データベース接続の具体的な実装 [DllImport] を提供できます。On iOS and Android the Sqlite database engine is built-in to the operating system, so the implementation can use [DllImport] as shown to provide the concrete implementation of database connectivity. プラットフォーム固有の実装コードの抜粋を次に示します。An excerpt of the platform-specific implementation code is shown here:

[DllImport("sqlite3", EntryPoint = "sqlite3_open")]
public static extern Result Open(string filename, out IntPtr db);

[DllImport("sqlite3", EntryPoint = "sqlite3_close")]
public static extern Result Close(IntPtr db);

完全な実装は、サンプル コードで確認できます。The full implementation can be seen in the sample code.

まとめSummary

この記事では、ポータブル クラス ライブラリの利点と落とし穴について簡単に説明し、Visual Studio for Mac と Visual Studio 内から PCL を作成および使用する方法について説明しました。最後に、PCL の動作を示す完全なサンプル アプリケーション TaskyPortable が導入されました。This article has briefly discussed the benefits and pitfalls of Portable Class Libraries, demonstrated how to create and consume PCLs from inside Visual Studio for Mac and Visual Studio; and finally introduced a complete sample application – TaskyPortable – that shows a PCL in action.