アプリのバージョン番号を取得するには?[ユニバーサルWindowsアプリ開発]:WinRT/Metro TIPS
Windowsストアアプリ/Phoneアプリで、アプリ自体のバージョン番号やこれに関連する情報を取得する方法を解説する。
powered by Insider.NET
ユニバーサルプロジェクトでアプリを作っているときに、アプリ自身のバージョン番号を取得したいと思ったことはないだろうか? 例えば、バージョン番号を表示したい場合があるだろう。あるいは、バージョン番号を設定ファイルに記録しておいて、バージョンアップ時の特別な処理で利用するといった用途なども考えられる。本稿では、マニフェストで設定したバージョン番号を取得する方法を説明する。なお、本稿のサンプルは「Windows Store app samples:MetroTips #85」からダウンロードできる。
事前準備
ユニバーサルプロジェクトを使ってユニバーサルWindowsアプリを開発するには、以下の開発環境が必要である。本稿では、無償のVisual Studio Express 2013 for Windowsを使っている。
- SLAT対応のPC*1
- 2014年4月のアップデート*2適用済みの64bit版Windows 8.1 Pro版以上*3
- Visual Studio 2013 Update 2*4適用済みのVisual Studio 2013(以降、VS 2013)*5
*1 SLAT対応ハードウェアは、Windows Phone 8.1エミュレーターの実行に必要だ。ただし未対応でも、ソースコードのビルドと実機でのデバッグは可能だ。SLAT対応のチェック方法はMSDNブログの「Windows Phone SDK 8.0 ダウンロードポイント と Second Level Address Translation (SLAT) 対応PCかどうかを判定する方法」を参照。なお、SLAT対応ハードウェアであっても、VM上ではエミュレーターが動作しないことがあるのでご注意願いたい。
*2 事前には「Windows 8.1 Update 1」と呼ばれていたアップデート。スタート画面の右上に検索ボタンが(環境によっては電源ボタンも)表示されるようになるので、適用済みかどうかは簡単に見分けられる。ちなみに公式呼称は「the Windows RT 8.1, Windows 8.1, and Windows Server 2012 R2 update that is dated April, 2014」というようである。
*3 Windows Phone 8.1エミュレーターを使用しないのであれば、32bit版のWindows 8.1でもよい。
*4 マイクロソフトのダウンロードページから誰でも入手できる。
*5 本稿に掲載したコードを試すだけなら、無償のExpressエディションで構わない。Visual Studio Express 2013 Update 2 for Windows(製品版)はマイクロソフトのページから無償で入手できる。Expressエディションはターゲットプラットフォームごとに製品が分かれていて紛らわしいが、Windowsストアアプリの開発には「for Windows」を使う(「for Windows Desktop」はデスクトップで動作するアプリ用)。
用語
本稿では、紛らわしくない限り次の略称を用いる。
- Windows:Windows 8.1とWindows RT 8.1(2014年4月のアップデートを適用済みのもの)
- Phone:Windows Phone 8.1
サンプルコードについて
Visual Studio 2013 Update 2では、残念なことにVB用のユニバーサルプロジェクトのテンプレートは含まれていない*6。そのため、本稿で紹介するVBのコードはユニバーサルプロジェクトではなく、PCL(ポータブルクラスライブラリ)を使ったプロジェクトのものである*7。
*6 VB用のユニバーサルプロジェクトは、来年にリリースされるといわれているVisual Studio「14」からの提供となるようだ。「Visual Studio UserVoice」(英語)のリクエストに対する、6月18日付けの「Visual Studio team (Product Team, Microsoft)」からの回答による。
*7 Visual Studio 2013 Update 2のVBでユニバーサルWindowsアプリを作る場合のお勧めは、「The Visual Basic Team」のブログ記事(英語)によれば、PCLを使う方法のようである。PCLに置いたものは、コードだけでなくXAML(画面)やリソースディクショナリなども共通に利用できる。そこで別途公開のサンプルコードでも、VBはWindows用/Phone用/共通コード(PCL)の3プロジェクト構成とした。ユニバーサルプロジェクトで作らなくてもユニバーサルWindowsアプリはリリースできるのである(「WinRT/Metro TIPS:ユニバーサルプロジェクトで開発するには?」参照)。
パッケージのバージョン番号
ユニバーサルプロジェクトで作るアプリのバージョン番号には、2種類ある。AssemblyInfoクラスに記述するものと*8、アプリのマニフェストに設定するものだ。後者がパッケージに付けられるバージョン番号であり、Windowsストアアプリでは設定チャームの[アクセス許可]に表示される(次の画像)。
パッケージのバージョン番号は、メジャー/マイナー/ビルド/リビジョンの4つの数字から成っている。既定では「1.0.0.0」から始まり、パッケージを作るたびに自動的にリビジョンがインクリメントされていく。ここでは、後ほど取得結果を確認できるように4つとも異なった数字を設定しておこう(次の画像)。
パッケージのバージョン番号を設定する(VS 2013)
ソリューションエクスプローラーでプロジェクトのマニフェスト(「Package.appxmanifest」ファイル)をダブルクリックして開き、[パッケージ化]タブ(赤丸内)の[バージョン](赤枠内)を設定する。
*8 AssemblyInfoクラスは、C#のプロジェクトでは「Properties」フォルダーの「AssemblyInfo.cs」ファイルに、VBでは「My Project」フォルダーの「AssemblyInfo.vb」ファイルに、それぞれ記述されている。ただし、VBでソリューションエクスプローラーに「AssemblyInfo.vb」ファイルを表示するには、そのプロジェクト(またはプロジェクト中の任意のファイル/フォルダー)を選択した状態でメニューの[プロジェクト]−[すべてのファイルを表示]をオンにしておく必要がある。なお、ここに記述するバージョン番号はアセンブリ(.exe/.dllファイル)ごとに付けられるもので、リフレクションを利用して取得することも可能だ(アセンブリのTypeInfoオブジェクトを取得し、そのAssemblyプロパティのCustomAttributesプロパティを列挙する)。
バージョン番号を取得するには
Packageクラス(Windows.ApplicationModel名前空間)のIdプロパティのVersionプロパティ(=Windows.ApplicationModel名前空間のPackageVersion構造体)を見ればよい。PackageVersion構造体には、メジャー/マイナー/ビルド/リビジョンのそれぞれが符号なし整数型のメンバーとして格納されている。
例えば、メジャー/マイナー/ビルド/リビジョンをピリオドでつないだ文字列として取得するには、次のコードのようにする。
var versionInfo = Windows.ApplicationModel.Package.Current.Id.Version;
string version = string.Format(
"{0}.{1}.{2}.{3}",
versionInfo.Major, versionInfo.Minor,
versionInfo.Build, versionInfo.Revision);
Dim versionInfo = Windows.ApplicationModel.Package.Current.Id.Version
Dim version As String = String.Format(
"{0}.{1}.{2}.{3}",
versionInfo.Major, versionInfo.Minor,
versionInfo.Build, versionInfo.Revision)
Packageクラスから取得できるその他の情報
上述のPackageクラスからは、パッケージのバージョン以外にもさまざまな情報が取得できる。主なプロパティを次に挙げておく。
- Package.Id.Architecture:
− ProcessorArchitecture列挙型(Windows.System名前空間)で、パッケージが対応しているCPUアーキテクチャを返す(実行中のCPUのアーキテクチャではない)。例えば、「Any CPU」用にビルドしたパッケージでは[Neutral]となる。 - Package.Id.Name:
− Stringクラス(System名前空間)で、マニフェストに指定されているパッケージ名を返す(パッケージ表示名ではない)。 - Package.Id.FamilyName:
− Stringクラスで、マニフェストに指定されているパッケージファミリー名を返す。 - Package.Id.FullName:
− Stringクラスで、パッケージの完全名を返す。 - Package.Id.Publisher:
− Stringクラスで、パッケージの発行者名を返す。Windowsでは「CN={マニフェストの[発行者]}」(発行者表示名ではない)という形式の、Phoneでは「CN={マニフェストの[発行者表示名]}」という形式の文字列である。 - Package.Id.PublisherId:
− Stringクラスで、パッケージの発行元IDを返す。これは、パッケージファミリー名の最後のアンダースコア(=「_」)以降の文字列と同じである。 - Package.InstalledLocation:
− StorageFolderクラス(Windows.Storage名前空間)で、インストールされているパッケージの場所を返す。
以下のプロパティはWindows専用である。Phoneではビルドエラーとなってしまうので注意してほしい。C#の共有プロジェクトで使う場合は「#if」ディレクティブを使って切り分ける必要がある*9。
- Package.DisplayName:
− Stringクラスで、マニフェストに指定されているパッケージ表示名を返す(Windows専用)。 - Package.Logo:
− Uriクラス(System名前空間)で、マニフェストに指定されているストアロゴの場所を返す(Windows専用)。XAMLコードで、Imageコントロール(Windows.UI.Xaml.Controls名前空間)のSourceプロパティに設定すれば、ストアロゴが表示される。 - Package.PublisherDisplayName:
− Stringクラスで、マニフェストに指定されているパッケージの発行者表示名を返す(Windows専用)。
*9 共有プロジェクトでWindowsとPhoneのコードを切り分ける方法については、「WinRT/Metro TIPS:WindowsとPhoneでロジックを切り分けるには?[ユニバーサルWindowsアプリ開発]」を参照してもらいたい。なお、VBでは共有プロジェクトを利用できないため、別途公開のVBのサンプルコードではこれら3項目を実装していない。
実行結果
以上のバージョン番号などのプロパティを表示する画面を作成すると、次の画像のようになる*10。
*10 画面にはプロパティの文字列を表示するためのTextBlockコントロール(Windows.UI.Xaml.Controls名前空間)と、ストアロゴ表示用のImageコントロールを配置した。また、各プロパティを文字列として(ストアロゴはUriも)公開するクラスを作成し、コントロールにバインドした。詳しくは、別途公開のサンプルコードをご覧いただきたい。
まとめ
マニフェストファイルに設定したバージョン番号は、Packageクラスを使って簡単に取得できる。Packageクラスからは、その他にもパッケージに関する情報が取得できるので活用してほしい。
Copyright© Digital Advantage Corp. All Rights Reserved.