Portable Class Library を試す
.NET で開発しているとアセンブリが使い回せなくて悩ましいことがけっこうあります。
Visual Studio 2012 からはポータブルクラスライブラリ(Portable Class Library、以下 PCL)が作れるようになっているので、少し試してみました。
とりあえず公式の情報は MSDN で確認してください。わかりにくいですが、ターゲットフレームワークごとの使える機能も少し載っています。
目次
ポータブルクラスライブラリ用のプロジェクトの作り方
[新しいプロジェクト…] から [テンプレート]→[Visual C#]→[ポータブルクラスライブラリ]を選びます。
ターゲットフレームワークを選択するダイアログが表示されます。
このダイアログとかデザインの統一とれてないなー、とか思いますが、それはさておき、ここで選ぶターゲットフレームワークによって使える機能が変わってきます。
参照設定を開くと、見慣れた System ほにゃららとか mscorlib とかはなく、 .NET Portable Subset というアセンブリのみが表示されます。これは選択したターゲットフレームワークに応じて、組み替えられたサブセットが自動的に追加されます。
プロジェクト作成後でもプロジェクトのプロパティから [ターゲットフレームワーク]→[変更…] を選ぶとターゲットフレームワークを選択するダイアログが表示され、いつでも変更できます。変更すると上述のサブセットも自動的に更新されます。もし新しいサブセットで使えない機能があればコンパイルできなくなりますので、ご注意を。
注意点
共通のアセンブリにできるということと引き替えに、失うものも結構あります。
Silverlight を入れると async/await 非同期メソッドが使えない
Silverlight はバージョン 5 でも async/await 非同期メソッドに対応していないので、これをターゲットフレームワークに入れているとサブセットのバージョンが v4.0 に下がってしまい、async/await の恩恵を受けることができません。
非同期メソッドをガシガシ使いたい場合は、.NET 4.5+Windows Phone 8 以上を選択するしかないようです。
HttpClientは使えない
.NET 4.5 から追加された System.Net.Http.HttpClient がとても便利ですが、Portable Class Library では基本的に使えません。
ターゲットフレームワークから Silverlight と Windows Phone を外してやると利用できるようになりますが、これだと PCL の意味がほとんどありません。
ということで BCL Team の人が別パッケージで作ってくれていますので、これを導入することができます。
- Portable HttpClient for .NET Framework and Windows Phone – BCL Team Blog – Site Home – MSDN Blogs
- NuGet Package of the Week #13 – Portable HttpClient makes portable libraries more useful – Scott Hanselman
この記事ではプレリリース版だと書かれていますが、2013/7/9 現在、安定版が NuGet から入手できます。
[ツール]→[ライブラリパッケージマネージャー]から[ソリューションの NuGet パッケージの管理…]を選びます。
[オンライン] で右上の検索ボックスに「Microsoft.Net.Http」(System.Net.Http ではなく Microsoft.Net.Http です)と入力すると「Microsoft HTTP Client Libraries」が現れますので、これをインストールします。詳細説明に “This package also supports Portable Class Libraries” と書かれているので、PCL をサポートしていることがわかります。
これで参照設定に System.Net.Http などが追加され、HttpClient が使えるようになります。
なお、HttpClient は PostAsync などの非同期メソッドが使えることがメリットなのですが、前述の通り、ターゲットフレームワークに Silverlight を入れているとサブセットが v4.0 になってしまい、 async/await が使えないので、下記のように怒られてしまいます。
System.Threading.Tasks.Task<System.Net.Http.HttpResponseMessage> を待機することができません。
この場合は、おとなしく Task の ContinueWith などで書くか、すぱっと Silverlight をあきらめるしかありません。なお、Microsoft.BCL.Async を導入する方法もありますが、ここでは割愛します。
最後までお読みいただきありがとうございました m(_ _)m