VS 2013に新しい形式のソリューションとプロジェクトが追加された。「ユニバーサルプロジェクト」(名前はプロジェクトだが作られるのはソリューションである)と「共有プロジェクト」*8だ。ユニバーサルプロジェクト(ソリューション)は、Windows用とPhone用と共有の3つのプロジェクト(および、それらから利用されるプロジェクト)からなっている。
共有プロジェクトは今までになかった形式で、プロジェクト単体ではビルドできない。WindowsとPhoneに共通なソース類の置き場所だと思ってもらって構わない。そして、ユニバーサルプロジェクトの中のWindowsやPhoneのプロジェクトをビルドするとき、共有プロジェクトの内容が自動的にマージされるのだ(次の図)。
このようにマージしてビルドするので、これら3つのプロジェクトは全てWindows Runtimeアプリでなければならない。Windows用のプロジェクトは、Windows 8.1用のストアアプリだ。Windows Phone 8.1で動作するアプリは3種類あると前述したが、ユニバーサルプロジェクトで使えるのはそのうちのWindows Runtimeアプリだけである。
マージは、フォルダー構成を保ったままファイルレベルで行われる。例えば、共有プロジェクト内の「Assets」フォルダーに置いた画像ファイルは、ビルドするWindows(またはPhone)のプロジェクトの「Assets」フォルダーに置かれているかのように扱われる。あるいは、共有プロジェクトにクラスのファイルを置いておき、Windows(またはPhone)のプロジェクトに対となるパーシャルクラスのファイルを置く、といったことも可能だ。
共有プロジェクトは「共通のソース置き場」であって、上図のようにしてビルドしても共有プロジェクトからはバイナリは全く生成されない。上図のソリューション(プロジェクトが3つある)をフルビルドすると、WindowsとPhoneのプロジェクトにそれぞれバイナリが出力される。前述したように、WindowsとPhoneで別々のアプリになるのだ。
また、共有プロジェクトには基本的に何でも置ける。ソースコードのファイルだけでなく、画像やリソースやユーザーコントロールのファイル、あるいはお勧めはできないが画面定義のXAMLファイルも置けるのだ。プロジェクト定義ファイルやマニフェストファイルなどの互換性のないものを除けば、何でも共有プロジェクトに置けるようである。
共有プロジェクトは、リンクを使ったソースコードファイルの再利用と似ているが、次のようなメリットがある。
*8 MSDNでは「shared project」。まだ公式な翻訳は出ていないが、仮に「共有プロジェクト」と訳しておく。
ユニバーサルプロジェクトは、Visual Studio 2013 Update 2でサポートされる。冒頭(「事前準備」の項)にも書いたように本稿執筆時点ではRCが提供されている(以降、Update 2 RC)。試してみるには、ExpressエディションでもよいのでVisual Studio 2013の開発環境を用意し、Update 2 RCをインストールしてほしい(Windowsストアアプリ用のExpressエディションにUpdate 2 RCを適用すると、Phoneアプリの開発もサポートされる)。
なお、Update 2 RCのユニバーサルプロジェクトではVisual Basicがサポートされていない(RTM(=正式版)ではサポートされるものと思われる)。
また、Update 2 RCは「go-live」ライセンスであり、製品開発に使用しても構わない*9。RTMへのアップデートもサポートされている*10。
*9 「go-live」といってもPhoneについては、本稿執筆時点ではストア側の準備が整っていないように見受けられる(ハードウェアが未発売だから当然ともいえるが)。公開済みのWindows Phone 8アプリのアップデートを提出しようと試してみたが、ストアとの関連付けができなかった。
*10 Update 2 RCのダウンロードページ(英語)のDetails(詳細)のところに「go-live」ライセンスであること、RTMへのアップデートがサポートされることが明記されている(日本語ページでは「go-live」がなぜか「リリース済み」と訳されている)。
ユニバーサルプロジェクトを作るには、2通りの方法がある*11。
*11 Phone用のソリューションにWindows用のプロジェクトを追加することによっても可能だ。だが、それならば最初からユニバーサルプロジェクトのソリューションを作ればよい。なお、Windows Phone Silverlight 8.0アプリ用のプロジェクトをWindows Phone Silverlight 8.1アプリ用のプロジェクトに再ターゲットすることはできるが、そこからユニバーサルプロジェクトには変換できない。
*12 ここでは新しいメニューを使わねばならない。ソリューションエクスプローラーでWindows用のプロジェクトを右クリックして[Windows Phone 8.1 の追加]を選んでほしい。通常のようにソリューションを右クリックして[追加]−[新しいプロジェクト]としたのでは、ユニバーサルプロジェクトにならない。
ここでは、新規にユニバーサルプロジェクトのソリューションを作ってみよう。言語はC#を使う。使用しているVS 2013はExpressエディションだ。
VS 2013を起動し、メニューから[ファイル]−[新しいプロジェクト]を選ぶ。すると、[新しいプロジェクト]ダイアログが出てくる(次の画像)。
ところで、上の画像では[クラス ライブラリ (ユニバーサル アプリ用ポータブル)]というプロジェクトを選択しているがこれは、WindowsとPhoneだけで使える新しいPCLのプロジェクトである。Expressエディションでも(限定的ながら)PCLが作れるようになったのだ。しかも、このPCLではWindows Runtimeが使えるのである。Windows.Xaml.UI名前空間などがこのPCLからは利用できるというわけだ。
さて、今回は[ユニバーサル アプリ]の[ハブ アプリケーション (ユニバーサル アプリ)]を選んでプロジェクトを作ってみよう。
生成されたソリューション(上の画像)を見てみると、Windows/Phone/共有の3つのプロジェクトが出来ている。共有プロジェクトには、「App.xaml」ファイル/「Assets」フォルダー/「DataModel」フォルダーなどがある。
「App.xaml」ファイルが共有されているということは、アプリのスタートアップ部分が共通になっているということだ。実は完全に同じとはいかず、後述する「#ifディレクティブ」を使ってWindowsとPhoneの違いに対処するコードになっている。
WindowsとPhoneのプロジェクトにも「Assets」フォルダーがあるが、共有フォルダーと同じ名前のフォルダーがあっても構わないのである。ただし、ビルド時にフォルダー構造を保ったままマージされるので、同じ名前のフォルダーに同じ名前のファイルが入っていると衝突してしまう。
共有プロジェクトの「DataModel」フォルダーには、モデルのコードが入っている。WindowsとPhoneのプロジェクトには「DataModel」フォルダーが(それに「Common」フォルダーも)存在しない。このテンプレートでは、ロジックは全て共有されているのだ。
このままビルドして実行してみよう(次の画像)。
このようにテンプレートのままなら、WindowsとPhoneでロジックを共有したアプリがビルド/実行できる。では、実際にはどうだろうか? そこで筆者は簡単なWindows 8.1用のアプリの移植に取り掛かってみた。できるだけロジック部分を共有プロジェクトに入れるようにして、である。すると、書いても書いてもエラーに遭遇しないのだ。ちょくちょく非互換に突き当たってビルドエラーになるだろうと思っていたのだが、予想は全く外れてしまった。もう無理矢理に複数ウィンドウを開くコード(そんな機能はPhoneにはない)を書いてみて、ようやく初めて非互換のエラーに遭遇できたほどだった。
Copyright© Digital Advantage Corp. All Rights Reserved.