アジョブジ星通信

日常系バンザイ。

ポータブルクラスライブラリでライブラリをつくるということ

f:id:azyobuzin:20140511133329p:plain

Visual Studio 2013 Update2 RC をインストールして起動してみたら、翻訳がまだまだな感じでした。課題の進捗?聞かないでください。

今回は CoreTweet の PCL 版作ってみたけどなんか微妙だったので結局プラットフォーム別に作ろうと思った、という話をします。うん、これからやるんだよ…。うん…。

ポータブルクラスライブラリの意義

汎用性のあるクラス ライブラリ プロジェクトでは、.NET FrameworkSilverlightWindows ストア アプリ用 .NETWindows Phone、および Xbox 360アセンブリのサブセットをサポートし、変更せずにこれらのプラットフォーム上で実行できるアセンブリのビルドに使用できる Visual Studio テンプレートを提供します。 汎用性のあるクラス ライブラリ プロジェクトを使用しない場合は、単一のアプリ タイプを対象として作成した後、他のアプリ タイプ用にクラス ライブラリを手作業で作り直す必要があります。 汎用性のあるクラス ライブラリ プロジェクトを使用すると、さまざまなデバイス用のアプリケーション間で共有されるポータブル アセンブリを作成することによって、コードの開発およびテストにかかる時間とコストを削減できます。

汎用性のあるクラス ライブラリを使用したプラットフォーム間の開発

プラットフォーム間でコードを共有できる。それ以外には特にない、以上!ということですね。

これで何が便利になるかというと、クライアント開発でマルチプラットフォーム対応するときにコード量の削減できたり、プロジェクト間でのファイルのリンクを管理しなくてよくなくなったりだと思います。

f:id:azyobuzin:20140511141642p:plain

さまざまなプラットフォームに対応したユーティリティライブラリを作成するということ

ユーティリティライブラリとはここでは CoreTweet のことを指します。もっといい言い方があったら教えてください。

マルチプラットフォーム対応と言ったら PCL を使うわけですが、実際 PCL で使えるクラスは本当に中途半端で、大体のことをするにはかなり妥協策が必要になると思います。妥協策の一つとして、 MSDN に書いてあるように abstract クラスを作って使う時にそれを継承して各プラットフォームごとの動作を書いて静的プロパティか何かにぶちこむとかが出来ると思います。ではこれをユーティリティライブラリでやったら?はい、ユーザーとしてはとても面倒臭いわけです。

NuGet の特性を利用したマルチプラットフォームライブラリ開発

結局のところ、まともにいろいろなプラットフォームに対応するには、各プラットフォーム向けに別々のコードにするのが一番です。しかしユーザーはマルチプラットフォームクライアントを作るために PCL を利用するかもしれません。そこで一番良い方法は、 PCL 版、そして各プラットフォーム版を作り、うまく実行環境に合わせて使用するアセンブリをすり替えてあげる方法です。

NuGet では package.config に書かれたプラットフォームに一番合うと考えられるアセンブリを参照に追加します。つまり PCL には PCL 版を、各プラットフォームのクライアントプロジェクトにはそのプラットフォームのアセンブリを参照に追加します。このように動作するように NuGet パッケージをつくることで、 PCL もクライアントアプリも同じクラスライブラリで開発することができます。このとき PCL 版は実際に動作する必要は求められないので、プラットフォーム固有の動作などはメンバーを存在させるだけにしておきます。

f:id:azyobuzin:20140511143153p:plain

これは Microsoft.Bcl などで使われている方法なので、 Package Explorer などで覗いてみるといいと思います。


まとめ

  • PCL 版ライブラリは PCL のために存在する
  • PCL 版と各プラットフォーム版を別々に作って NuGet パッケージで配布しよう!