Portable Class Library を試す

  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存

.NET で開発しているとアセンブリが使い回せなくて悩ましいことがけっこうあります。

Visual Studio 2012 からはポータブルクラスライブラリ(Portable Class Library、以下 PCL)が作れるようになっているので、少し試してみました。

.NET Framework を使用したプラットフォーム間の開発.NET Framework を使用したプラットフォーム間の開発

とりあえず公式の情報は MSDN で確認してください。わかりにくいですが、ターゲットフレームワークごとの使える機能も少し載っています。

スポンサーリンク

ポータブルクラスライブラリ用のプロジェクトの作り方

[新しいプロジェクト…] から [テンプレート]→[Visual C#]→[ポータブルクラスライブラリ]を選びます。

新しいプロジェクトの作成で ポータブルクラスライブラリ を選ぶ

ターゲットフレームワークを選択するダイアログが表示されます。

対象とするフレームワークを選べる

このダイアログとかデザインの統一とれてないなー、とか思いますが、それはさておき、ここで選ぶターゲットフレームワークによって使える機能が変わってきます。

参照設定を開くと、見慣れた System ほにゃららとか mscorlib とかはなく、 .NET Portable Subset というアセンブリのみが表示されます。これは選択したターゲットフレームワークに応じて、組み替えられたサブセットが自動的に追加されます

参照設定には .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 の人が別パッケージで作ってくれていますので、これを導入することができます。

この記事ではプレリリース版だと書かれていますが、2013/7/9 現在、安定版が NuGet から入手できます。
[ツール]→[ライブラリパッケージマネージャー]から[ソリューションの NuGet パッケージの管理…]を選びます。

NuGet を起動する

[オンライン] で右上の検索ボックスに「Microsoft.Net.Http」(System.Net.Http ではなく Microsoft.Net.Http です)と入力すると「Microsoft HTTP Client Libraries」が現れますので、これをインストールします。詳細説明に “This package also supports Portable Class Libraries” と書かれているので、PCL をサポートしていることがわかります。

Microsoft.Net.Http を検索してインストール

これで参照設定に System.Net.Http などが追加され、HttpClient が使えるようになります。

なお、HttpClientPostAsync などの非同期メソッドが使えることがメリットなのですが、前述の通り、ターゲットフレームワークに Silverlight を入れているとサブセットが v4.0 になってしまい、 async/await が使えないので、下記のように怒られてしまいます。

Silverlight をターゲットに入れると .NET Portable Subset が v4.0 になってしまう

「System.Threading.Tasks.Task<T> が待機できません」と怒られる

System.Threading.Tasks.Task<System.Net.Http.HttpResponseMessage> を待機することができません。

この場合は、おとなしく Task の ContinueWith などで書くか、すぱっと Silverlight をあきらめるしかありません。なお、Microsoft.BCL.Async を導入する方法もありますが、ここでは割愛します。

最後までお読みいただきありがとうございました m(_ _)m

スポンサーリンク
  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存