Xamarin逆引きTips
Xamarin.iOS/Androidでソースコードを共有するには(ポータブルクラスライブラリ編)
Xamarin.iOS/Android間でソースコードを共有する方法の1つとして、複数のプロジェクトから共通のポータブルクラスライブラリ(PCL)を参照する方法を説明する。
前回に引き続き、複数のプロジェクトでソースコードを共有する方法を解説する。今回は、ポータブルクラスライブラリ(PCL: Portable Class Library、以下「PCL」とする)と呼ばれるライブラリを作成し、それを他のプロジェクトから参照する方法について解説する。
なお、前回作成したソリューション「CalcSample」を使用するので、準備できていない人は前回のTipsを参照してほしい。
1. シナリオ
前回は、簡単な計算を行うアプリケーション「CalcSample」を、Xamarin.iOS「Calc.iOS」プロジェクトとXamarin.Android「Calc.Android」プロジェクトで2種類作成した。今回は、両者のアプリケーションで共通な計算処理であるCalc.cs
ファイル(※前回作成済み)を含めるためのPCLを、「CalcSample.Core」という名前で作成し(※作成方法は後述)、両者のプロジェクトがこれを参照する。図にすると、次のようになる。
Xamarinにおける「ライブラリ」とは?
ネイティブのAndroid開発では、再利用可能なコードをライブラリ(.jarファイル)に切り出すことができる。
ネイティブのiOS開発でも、Static Library(.aファイル、スタティックライブラリ)やFramework(.frameworkファイル、フレームワーク)を作成することができる。
Xamarinは.NETのテクノロジを使用した開発ツールなので、このような再利用可能部品のことを「アセンブリ(.dllファイル)」と呼ぶ。
ポータブルクラスライブラリ(PCL)とは?
PCLとは、上記で解説した「アセンブリ」の再利用性をさらに高めたもので、.NET Frameworkの範ちゅうであるWindows(デスクトップ)、Windows Phone、Xbox 360に加え、Xamarinの範ちゅうであるiOSやAndroidまでもが、同一のアセンブリ(.dll)で動作可能になるものだ。
PCLについての詳しい内容は、下記の記事を参照されたい。
PCLには、そのアセンブリが対応するプラットフォームの種類に応じて「プロファイル」が定義されており、2014年11月現在、Xamarinで推奨されているのは「Profile78」だ。
Profile78が対応するプラットフォームは図2の通りだ(※表示方法は後述)。今後プラットフォームが増えるなどした場合は、新しいProfileが定義されるはずだ。作成したアセンブリをそのプラットフォームにも対応させたい場合は、Profileを変更してビルドし直す必要がある。
2. CalcSample.iOSとCalcSample.Androidから「Calc.cs」を削除する
前回のソリューションツリーの内容は図3のようになっているはずだ。
この中のCalc.cs
を削除する。ちなみに、CalcSample.Androidプロジェクト内のCalc.cs
はリンクファイルなので、削除しても実体が削除されるわけではなく、参照のみが削除される。Calc.cs
ファイルは、後のポータブルクラスライブラリ作成の手順で再度作成することになるので、コピーを保存しておいても構わない。
Calc.cs
を削除すると、それを使用していた箇所(CalcSample.iOSプロジェクトのSampleCalc.iOSViewController.cs
ファイルとCalcSample.AndroidプロジェクトのMainActivity.cs
ファイル)がエラーとなるが、ここまでの手順ではそのままでよい。
3. CalcSample.Coreの作成
CalcSampleソリューションに、PCLプロジェクト「CalcSample.Core」を作成する。
ソリューションをマウスで右クリックし、表示されるコンテキストメニューの[追加]-[新しいプロジェクトを追加]を選択すると表示されるダイアログボックス(図4参照)で、[C#]の[Portable Library]テンプレートを選択し、プロジェクト名を「CalcSample.Core」として[OK]ボタンを押す。
作成後、[プロジェクト オプション]ダイアログで[ビルド]-[一般]を見てみると(図5)、図2と同じく「Profile78」であることが確認できる。
次に、MyClass.cs
のファイル名をCalc.cs
に変更して、以下のように実装する。この実装は前回のCalc.cs
ファイルと全く同じものだ。
using System;
namespace CalcSample.Core
{
public class Calc
{
public int Add(int numberA, int numberB)
{
return numberA + numberB;
}
}
}
|
4. CalcSample.iOSからCalcSample.Coreを参照する
次に、前回作成したCalcSample.iOSプロジェクトで、PCLのCalcSample.Coreプロジェクトを使用できるようにする。
ソリューションツリーのCalcSample.iOS
の中にある[参照]をマウスで右クリックして[参照アセンブリの編集]を選択し、表示されるダイアログボックス(図6)の[Projects]タブで「CalcSample.Core」にチェックを入れ、[OK]ボタンを押す。
5. CalcSample.AndroidからCalcSample.Coreを参照する
Android側のプロジェクトも同様に、[参照アセンブリの編集]から、「CalcSample.Core」にチェックを入れて参照を追加する。
ここまでのプログラムをiOS/Androidで実行すると図7のようになる。
【コラム】アセンブリ参照とプロジェクト参照
今回の解説では、[参照アセンブリの編集]ダイアログボックスで[Projects]タブを使用したが、これは「プロジェクト参照」と呼ばれるもので、参照したいライブラリが同一ソリューション内にプロジェクトとして存在するときに使用する手法だ。
これとは別に、商用のライブラリやネット上で配布されているアセンブリを使用したい場合は、[.Net Assembly]タブから.DLLファイルを選択する。
まとめ
「ポータブルクラスライブラリ(PCL)によるソースコードの共有」について解説した。
この手法は、「Sharing Code Options | Xamarin(英語)」の「Portable Class Libraries」で使われている方式だ。リンクファイルに比べれば若干手間がかかるが、アセンブリ(.dll)を作成してしまえば、利用するのは容易で、かつコードが実行できることは保証されている(テストが不要かどうかは別の問題だ)。
PCLのデメリットは、使用できるAPIに制限があることだ。iOSやAndroidのネイティブのAPIはもちろん、.NET Frameworkの中でも、基本的なAPI群しか使用できない。このような場合は、PCLでは機能のインターフェースのみを定義し、ネイティブのライブラリで機能を実装し、Dependency Injection(依存性の注入)のテクノロジでインターフェースに機能を「注入」することだ。この手法はXamarin独自でなく、一般的なプログラム開発手法であり、特にPCL関連でWindowsの複数のプラットフォームに対応する開発で多用されている。詳しくは以下のリンクを参照されたい。
※以下では、本稿の前後を合わせて5回分(第25回~第29回)のみ表示しています。
連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。
25. Xamarin.iOS/Androidでログを出力するには?
Xamarin.AndroidでネイティブAndroidのLogクラスを使ってログ出力する方法と、Xamarin.iOS/Androidで.NET基本クラスライブラリ機能を使ってログ出力する方法を解説する。
26. Xamarin.iOS/Androidでソースコードを共有するには?(リンクファイル編)
Xamarin.iOS/Android間でソースコードを共有する方法の1つとして、Xamarin Studioのプロジェクト内でソースファイルへのリンクを追加する方法を説明する。
27. 【現在、表示中】≫ Xamarin.iOS/Androidでソースコードを共有するには(ポータブルクラスライブラリ編)
Xamarin.iOS/Android間でソースコードを共有する方法の1つとして、複数のプロジェクトから共通のポータブルクラスライブラリ(PCL)を参照する方法を説明する。
28. Xamarin.iOS/AndroidでJSONを扱うには?(Json.NET使用)
Web APIにおけるデータフォーマットの定番になっているJSONを、Xamarin.iOS/Androidで扱うには? 「Json.NET」というライブラリを使う方法を説明する。
29. Xamarin.iOS/Androidでアプリのデータディレクトリを取得するには?
アプリ固有のデータ領域のディレクトリパスを取得するため方法のうち、iOS/Androidで共通のコードの書き方を説明する。