共通化について
コードの共有が開発効率に影響する
今回紹介するXamarin、そしてUniversal Windowsアプリケーションと、マルチプラットフォーム開発が進むなか、コードの共有が開発効率に与える影響が大きくなりつつあります。
XamarinはiOS、AndroidのネイティブなAPIをC#でラッパーした形で呼び出すため、コードの共有は難しいのではと感じていましたが、実際にアプリを作成してみると、アプリの機能次第では、多くのコードが共有できると考えるようになりました。
ファイル操作などは共通の仕組みが用意されている
iOS、Android共通のファイル操作としてSystem.IO.Fileクラスが用意されており、それぞれのネイティブなAPIではなく、System.IO.Fileファイルクラスを利用することでコードを共有できます。
ただし、Windows Phone、Windowsストアアプリも共有化しようとするとSystem.IO.Fileファイルクラス以外を使う必要が出てきます。
プラットフォーム固有のAPIを使わなくても意外と書ける
アプリケーションの機能にもよりますが、シンプルなものであれば、プラットフォーム固有のAPIを使う部分だけ分離することで意外と開発できます。この辺は作るアプリケーションの機能によって大きく感想が異なる部分かもしれません。
コードを共有する仕組み
Xamarinを用いたマルチプラットフォーム開発では、以下のようなコードを共有する仕組みが主に用いられます。
Sharedプロジェクト
Sharedプロジェクトは、Universal Windowsアプリケーションのコードを共有する仕組みとして登場しました。文字通り、複数のプロジェクトでコードをShare(共有)することができるプロジェクトです。
Visual StudioでSharedプロジェクトを利用する場合は、Universal Windowsアプリケーションで追加された既存のSharedプロジェクトを利用するか、Shared Project Reference Managerを利用します(Visual Studio Expressエディションは不可)。
Sharedプロジェクトは後述するPCL(Portable Class Library)のようにdllとして再利用するポータビリティはありませんが、それぞれのプラットフォームごとにケースわけしてコードを記述することができます。
#if __WINDOWS_PHONE_APP__
str = "Hello Windows Phone";
#endif
#if __IOS__
str = "Hello iOS";
#endif
#if __WINDOWS_APP__
str = "Hello Windows";
#endif
#if __ANDROID__
str = "Hello Android";
#endif
PCL(Portable Class Library)
PCLは異なる.NET環境(WPF、Windows Phone, Windowsストアなど)で共通で利用できるライブラリを作成するための仕組みです。XamarinをインストールするとPCLにXamarin.iOS、Xamarin.Androidが追加されます。
PCLには対応するすべてのプラットフォームで動作するコードしか記述できません。
Sharedプロジェクトのように場合分けを行うことはできないので、PCLでコードの共有を図る場合は、PCL部分はinterfaceによる操作を記述して、実装は各プラットフォームのプロジェクトというような工夫が必要ですが、この方法だとPCLのポータビリティは低下してしまいます。
