[VS2010]exeのバージョン表示で,リビジョンNoを自動インクリメントさせる

VisualStudio2010で作成したアプリには、バージョン番号を付与する事ができます。
アプリにバージョン番号を付与しておく事で、ユーザは自分が使用しているアプリが最新なのかを簡単に把握する事ができます。

このバージョン番号は、VisualStudio2010のデフォルトでは開発者が明示的に指定する事になりますが、場合によっては自動でインクリメントしてくれた方が便利な場合があります。

そこで、本記事では、バージョン番号を自動インクリメントさせる方法を説明します。
また、リビジョン番号を自動更新させるとuser.configの取り扱いで問題が出てくるため、この対処法も合わせて説明します。


exeのバージョンNoを自動インクリメントさせる


バージョン番号は4つの数字で構成されており、以下の構成をとります。

メジャーバージョン.マイナーバージョン.ビルド番号.リビジョン



このうち、自動更新が可能なのは、ビルド番号と、リビジョンのみです。
ビルド、リビジョン番号を自動更新させるには、以下の設定を行います。

VisualStudioのメニューより、プロジェクト->exeのプロパティを選択します。


アプリケーションタブの、アセンブリ情報ボタンをクリックします。


アセンブリバージョンの欄の3,4つ目を、”*”(アスタリスク)に変更します。
※下の画像では4つ目だけを”*”にしていますが、3つ目も”*”にしてください!!


これで、コンパイルを行うたびにリビジョン番号が更新されるようになります。


バージョンNoの付番ルール


この設定を行って何回かビルドしてみると、バージョン番号の増え方がちょっと変わっている事に気づきます。自動でバージョンNoをインクリメントすると、数字が1づつ増えるというわけではなく、一気に数字が増えていきます。
どんな規則で増えて行くか、気になったので調べてみると、http://msdn.microsoft.com/en-us/library/c405shex.aspxに説明がありました。

If you specify major and minor, you can specify an asterisk (*)for build.
This causes build to be equal to the number of days since January 1, 2000, local time, 
and revision to be equal to the number of seconds since midnight of the current day,
local time, divided by 2.
 
If you specify major, minor, and build, you can specify an asterisk for revision. 
This causes revision to be equal to the number of seconds since midnight of the current day, 
local time, divided by 2.



要は、以下のようなルールで決まるという事になります。

メジャーバージョン:手動指定のみ可
マイナーバージョン:手動指定のみ可
ビルド番号        :2000/1/1からの経過日数
リビジョン        :その日の00:00:00からの経過秒数を2で割った数
 
※時刻はlocal timeなので、GMTではなくJST基準です。



上記の事から分かる問題点としては、[assembly: AssemblyVersion( “1.0.0.*” )]という様に、ビルド番号を明示した上でリビジョンだけ可変にしてしまうと、日が変わったときにバージョン番号が戻ってしまいます。これでは、どのexeが最新バージョンか分からなくなってしまうので要注意です。



バージョンNoは自動インクリメントすべきか?


自動インクリメントを利用すると、バージョン番号の設定し忘れが無くなって基本的には便利なのですが、以下のようなデメリットもあるので、状況によっては使い分けが必要です。
(詳細は、http://msdn.microsoft.com/ja-jp/library/ms998223.aspxを見ると詳しいです。)

1.内部アセンブリビルド番号と、システムビルド番号にずれが発生してしまう。

2.ビルド番号、リビジョン番号が1づつ増えるわけではないので、ユーザが今利用しているexeと最新版との違い(最新版がどの程度バージョンアップされたものなのか)を把握しづらい。

3.ライブラリの作成時は、毎回バージョンが替わってしまうので、ライブラリを使用するクライアント側でアセンブリを厳密に名前指定している場合、クライアント側もリビルドする必要が出てくる。


単純なexeを作る場合は余り問題なさそうですが、DLL開発の時とかは検討が必要っぽいです。


バージョン間でuser.config情報を引き継がせる

他のハマりどころとしては、リビジョンNoを自動インクリメントさせていて、かつ、user.configを使用している場合、一旦保存したuser.configの情報が正しく取れなくなってきます。これは、user.configを保存するフォルダ名にバージョン名が含まれている為で、リビジョンが更新されるとuser.configの保存先フォルダが変わってしまうからです。


特に開発中はコンパイルを行うたびにリビジョンが替わってしまうので、実質的にuser.configに覚えさせた内容が意味を成さなくなってしまいます。

これを避けるには、バージョンが替わっても、旧リビジョン(バージョン)で保存したuser.configの内容を引き継がせるようにします。
方法は、以下のコードを組み込み、アプリケーションの起動時に走るようにしておきます。

//------------------------------------------
// アップグレードが必要か確認する
//------------------------------------------
if ( !Properties.Settings.Default.IsUpgrade ) {
	// 前バージョンの情報取得する
	Properties.Settings.Default.Upgrade();
 
	// アップグレードを行った事をセットする
	Properties.Settings.Default.IsUpgrade = true;
	Properties.Settings.Default.Save();
 
	Debug.Print( "設定ファイルのアップグレードが行われました" );
}



また、以下のようにIsUpgradeという項目をboolとしてuser.configに追加しておきます。
これは、二回目以降の起動で既にuser.configがアップグレード済みの時に、再度アップグレード処理が走るのを防ぐためです。



これによって、バージョンが替わったときでも、旧バージョンの設定を引き継いでくれます。
(app.configのフォルダは、新旧両方とも残ります)


プログラムからexeのバージョンを取得するには

上記の方法で設定したバージョン番号ですが、下記のコードでプログラムから取得できます。

System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();




関連記事

コメントを残す

メールアドレスが公開されることはありません。