読者です 読者をやめる 読者になる 読者になる

マイクロソフト エバンジェリストのブログ

日本マイクロソフトのエバンジェリストが、技術情報を発信するブログです!

Windows ストア アプリのビルド ターゲットについて

Windows ストア アプリ VisualStudio JavaScript

エバンジェリストの荒井です。
今回は、Visual Studio を使っている時にビルド時に利用する構成マネージャを解説します。最初に、言語としてC#、VB、JavaScriptを使用しているプロジェクトの構成マネージャは以下のようになっています。

f:id:ms_eva:20131112093847p:plain

ターゲットとなるプラットフォームには、Any(デフォルト)、x64、x86、ARMがあります。Anyにすると作成されるバイナリー(PEファイル)のヘッダー情報には、x86(0x14C)が書き込まれることで32ビットの実行バイナリーを示すようになります。

たとえば、BingMap SDKやSQLiteなどを使用する場合は、Anyではなく、x64、x86、ARMなどとターゲットとするCPUアーキテクチャを明示的に指定する必要があります。この理由は、BingMap SDKやSQLiteが VC++のランタイム ライブリーに依存しているからです。VC++ランタイム ライブラリーは、ターゲットCPUごとのネイティブコードを含んでいることから、Any(デフォルト)のターゲット プラットフォームを使用できなくなります。HTML/JavaScriptのストア アプリの場合は、コード自体はバイナリーではありませんが、依存するライブラリーに応じてターゲット プラットフォームを変更する必要があります。一方で、HTML/JavaScriptのストア アプリをインストールすると、JavaScriptコードがプリコンパイルされます。プリコンパイルすることで、実行時の速度がC#やVBと遜色がないようになります。

今度は、C++で作成するストア アプリのプロジェクトの構成マネージャを以下に示します。

f:id:ms_eva:20131112093822p:plain

C++/CXのターゲット プラットフォームは、Win32(デフォルト)、x64、ARMがあります。Win32が、x86のネイティブコードを出力することになります。C#やVBなどと違って、Anyが存在しないのがC++の特徴になっています。Anyという設定は、CPUアーキテクチャ非依存の開発環境だけの特別な設定になるわけです。つまり、C#とVBが出力するコードは、CPU非依存の中間言語(MSIL)であり、HTML/JavaScriptは単なるテキストなのでCPU非依存となるわけです。一方で、C++コンパイラーは、CPU依存のネイティブコードを出力するという理由から、ターゲットプラットフォームにこのような違いが存在するのです。

ストアへ提出するパッケージ

ストアへ提出する場合は、パッケージ(appxファイル)を作成する必要がありますが、この時にターゲット プラットフォームを注意する必要があります。

f:id:ms_eva:20131112100105p:plain

Neutralは、C#やVB、HTML/JavaScriptのアプリでVC++ランタイムに依存しない場合に選択することができます。Neutralで作成したパッケージは、x86/x64/ARMのプラットフォームで動作させることができます。

一方で、VC++ランタイムに依存していたり、VC++で開発したアプリの場合は、Neutralのチェックを取り、目的とするアーキテクチャに対してチェックを付けます。たとえば、x86/x64/ARMで動作させたい場合はx86/x64/ARMにチェックを付けます。

Windows 8.1向けに拡張された機能として、アプリケーション バンドルがあります。アプリケーション バンドルを使用しない場合は、同じバージョン番号で目的のアーキテクチャごとのパッケージを作成します。つまり、x86/x64/ARMという3種類のパッケージで、ストアに申請するときに3種類のパッケージをアップロードします。

アプリケーション バンドルを使用すると、x86/x64/ARMにチェックを付けても1つのアプリケーション バンドルを作成するようになります。作成されたアプリケーション バンドルの中にx86/x64/ARMのパッケージが含まれている構造となります。アプリケーション バンドルの本来の目的は、アプリケーションコードとリソースファイルの分離にあります。たとえば、複数の言語に対応するためのリソースであったり、ゲームコンテンツ向けのリソースなどが、アプリケーションコード以上に容量を必要とすることが良くありますから、このような時に容易にリソースを入れ替えできるようにするというのが、アプリケーション バンドルの目的なのです。

作成されるアプリ パッケージに応じて、適切にCPUアーキテクチャやアプリ パッケージなのか、アプリケーション バンドルなのかを選択するようにしてください。