.NET TIPS

バージョン情報ダイアログを作成するには?

デジタルアドバンテージ 一色 政彦
2005/04/01

 Windowsアプリケーションでは、実行中のアプリケーションが一体どのバージョンなのかを、ユーザーが簡単に調べられるように、[バージョン情報]ダイアログを用意することが一般的だ。この[バージョン情報]ダイアログは、メイン画面のメニュー・バーから表示できるようにすることが多い。

 例えばWindows標準のテキスト・エディタである「メモ帳」では、メニュー・バーの[ヘルプ]−[バージョン情報]から、次の画面のような[メモ帳のバージョン情報]ダイアログを表示できる。

[メモ帳のバージョン情報]ダイアログ
[スタート]メニューの[すべてのプログラム]−[アクセサリ]−[メモ帳]からメモ帳を起動し、その[バージョン情報]ダイアログを起動したところ。
  メニュー・バーの[ヘルプ]−[バージョン情報]を選択すると、[メモ帳のバージョン情報]ダイアログが表示される。
  バージョン情報。製品名(1行目)、バージョン番号(2行目)、コピーライト(3行目)が表示されている。

 本稿では、このような[バージョン情報]ダイアログを作成する方法を紹介する。

Windowsアプリケーションの[バージョン情報]ダイアログの作成方法

 まずはダイアログをモーダルで作成して、それをアプリケーションのメイン画面のメニュー・バーなどから呼び出す必要がある。この実装についてはここでは割愛する。モーダル・モードのダイアログを構築する方法については「TIPS:モーダル・ダイアログやモードレス・ダイアログを表示するには?」を参照してほしい。

 次に作成したダイアログ上にバージョン情報を表示する。本稿では次のようなダイアログ画面を構築することにしよう。

本稿で作成する[バージョン情報]ダイアログ
この[バージョン情報]ダイアログでは、アプリケーションの製品名やバージョンなどに関する情報が表示されている。
  フォームのタイトルに「<製品名> のバージョン情報」というテキスト(フォームのTextプロパティ)を設定する。
  PictureBoxコントロールにアプリケーション・アイコン(コントロールのImageプロパティ)を表示する。
  Labelコントロールに「<会社名> <製品名>」というテキスト(コントロールのTextプロパティ。以下同様)を設定する。
  Labelコントロールに「Version <バージョン名>」というテキストを設定する。
  Labelコントロールに「<コピーライト>」というテキストを設定する。
  Labelコントロールに「<説明記述>」というテキストを設定する。
  [OK]ボタン。これをクリックするとダイアログが閉じられる。

 上記の画面のとおりに、PictureBoxコントロール、Labelコントロール、Buttonコントロールを配置してほしい。の[OK]ボタンに関しては、Clickイベント・ハンドラを追加して、そこでフォームのCloseメソッドを呼び出すことで、ダイアログが閉じられるようにしておこう。

 ダイアログ上に表示されているバージョン情報については、本稿では、ハード・コーディングで設定するのではなく、アセンブリに指定されている既存のバージョン情報を利用する。このようにすることでバージョン情報の記述を1カ所で集中管理できるようになり、バージョン情報を複数個所に記述した場合に発生しがちな変更漏れを防げる。つまり、バージョン情報を更新した場合も、この[バージョン情報]ダイアログには一切手を触れる必要がなくなるのだ。

 なおここで「既存のバージョン情報」と呼んでいるものは、Visual Studio .NETでプロジェクトを作成した場合に生成されるAssemblyInfo.cs(C#の場合)もしくはAssemblyInfo.vb(VB.NETの場合)という名前のファイル内で指定されたアセンブリ属性の情報のことだ。このアセンブリ属性の指定内容については、「TIPS:アセンブリにバージョン情報を設定するには?」を参照していただきたい。

 それではアセンブリからのバージョン情報の取得方法について説明していこう。

アセンブリからのバージョン情報を取得するには?

●<会社名>/<製品名>/<バージョン名>

 <会社名>/<製品名>/<バージョン名>の取得は、Applicationクラス(System.Windows.Forms名前空間)のプロパティとして用意されているので、その実装は非常に簡単だ。具体的に次のようなコードにより取得できる。

// C#
// バージョン名(AssemblyInformationalVersion属性)を取得
string appVersion = Application.ProductVersion;
// 製品名(AssemblyProduct属性)を取得
string appProductName = Application.ProductName;
// 会社名(AssemblyCompany属性)を取得
string appCompanyName = Application.CompanyName;
' VB.NET
' バージョン名(AssemblyInformationalVersion属性)を取得
Dim appVersion As String = Application.ProductVersion
' 製品名(AssemblyProduct属性)を取得
Dim appProductName As String = Application.ProductName
' 会社名(AssemblyCompany属性)を取得
Dim appCompanyName As String = Application.CompanyName

 これにより、上記画面の のテキストについては設定できる。

 ちなみに、バージョン名を文字列ではなく、Versionクラス(System名前空間)のオブジェクトとして取得したい場合には、次のようなコードを記述すればよい。

 なお上記のバージョン名はAssemblyInformationalVersion属性の値であるのに対し、下記のものはAssemblyVersion属性の値だ。これらの値は、AssemblyVersion属性のみを指定している場合には(つまり通常は)一致するが、AssemblyFileVersion属性やAssemblyInformationalVersion属性を指定している場合には異なってくる可能性がある。これについては前掲のTIPSを参照してほしい。

// C#
Assembly mainAssembly = Assembly.GetEntryAssembly();
AssemblyName mainAssemName = mainAssembly.GetName();
// バージョン名(AssemblyVersion属性)を取得
Version appVersion = mainAssemName.Version;
' VB.NET
Dim mainAssembly As [Assembly] = [Assembly].GetEntryAssembly()
Dim mainAssemName As AssemblyName =  mainAssembly.GetName()
' バージョン名(AssemblyVersion属性)を取得
Dim appVersion As Version =  mainAssemName.Version

 このVB.NETのコードで、Assemblyクラスの記述が[]で囲まれているのは、VB.NETのAssemblyキーワードとの重複を回避するためだ(これについては「TIPS:C#やVB.NETでキーワードを識別子として使用するには?」を参照してほしい)。

●<コピーライト>/<説明記述>

 <コピーライト>と<説明記述>の取得は少しやっかいだ。これらの情報はプロパティが用意されていないので、アセンブリから直接取得する必要がある。

 具体的にはまず、Assemblyクラス(System.Reflection名前空間)のGetEntryAssemblyメソッドにより、エントリ・ポイントを含むアセンブリ(Assemblyオブジェクト)を取得する。多くの実行ファイル(.EXEファイル)においては、これはMainメソッドを含んだアセンブリとなっている。

 次にそのAssemblyオブジェクトのGetCustomAttributesメソッドを利用して、AssemblyCopyright属性(System.Reflection名前空間)の情報(=<コピーライト>の情報)と、AssemblyDescription属性(System.Reflection名前空間)の情報(=<説明記述>の情報)を取得する。このGetCustomAttributesメソッドの使い方についてはMSDNの「Assembly.GetCustomAttributes メソッド」を参照されたい。

 具体的な実装コードの例は次のとおりだ。

// C#
Assembly mainAssembly = Assembly.GetEntryAssembly();

// コピーライト情報を取得
string appCopyright = "-";
object[] CopyrightArray =
  mainAssembly.GetCustomAttributes(
    typeof(AssemblyCopyrightAttribute), false);
if ((CopyrightArray != null) && (CopyrightArray.Length > 0))
{
  appCopyright =
    ((AssemblyCopyrightAttribute)CopyrightArray[0]).Copyright;
}

// 詳細情報を取得
string appDescription = "-";
object[] DescriptionArray =
  mainAssembly.GetCustomAttributes(
    typeof(AssemblyDescriptionAttribute), false);
if ((DescriptionArray != null) && (DescriptionArray.Length > 0))
{
  appDescription =
    ((AssemblyDescriptionAttribute)DescriptionArray[0]).Description;
}
' VB.NET
Dim mainAssembly As [Assembly] = [Assembly].GetEntryAssembly()

' コピーライト情報を取得
Dim appCopyright As String = "-"
Dim CopyrightArray() As Object = _
  mainAssembly.GetCustomAttributes( _
    GetType(AssemblyCopyrightAttribute), False)
If Not (CopyrightArray Is Nothing) AndAlso (CopyrightArray.Length > 0) Then
    appCopyright = _
      (CType(CopyrightArray(0), AssemblyCopyrightAttribute)).Copyright
End If

' 詳細情報を取得
Dim appDescription As String = "-"
Dim DescriptionArray() As Object = _
  mainAssembly.GetCustomAttributes( _
    GetType(AssemblyDescriptionAttribute), False)
If Not (DescriptionArray Is Nothing) AndAlso (DescriptionArray.Length > 0) Then
    appDescription = _
      (CType(DescriptionArray(0), AssemblyDescriptionAttribute)).Description
End If

 これにより、上記画面の のテキストを設定できる。

●アプリケーション・アイコン

 アプリケーション・アイコンの取得方法については「TIPS:実行ファイルからアプリケーションのアイコンを取得するには?」を参照していただきたい。注意点としては、アプリケーション・アイコンを取得するファイルへのパスが、そのアプリケーション自体であることだ。このパスは、AssemblyオブジェクトのLocationプロパティより取得できる。

 具体的には、次のようなコードを記述すればよい。

// C#
// アプリケーション・アイコンを取得
Icon appIcon;
SHFILEINFO shinfo = new SHFILEINFO();
IntPtr hSuccess = SHGetFileInfo(
  mainAssembly.Location, 0,
  ref shinfo, (uint)Marshal.SizeOf(shinfo),
  SHGFI_ICON | SHGFI_LARGEICON);
if (hSuccess != IntPtr.Zero)
{
  appIcon = Icon.FromHandle(shinfo.hIcon);
}
else
{
  appIcon = SystemIcons.Application;
}
' VB.NET
' アプリケーション・アイコンを取得
Dim appIcon As Icon
Dim shinfo As New SHFILEINFO()
Dim hSuccess As IntPtr = SHGetFileInfo( _
  mainAssembly.Location, 0, _
  shinfo, Marshal.SizeOf(shinfo), _
  SHGFI_ICON Or SHGFI_LARGEICON)
If hSuccess.Equals(IntPtr.Zero) = False Then
    appIcon = Icon.FromHandle(shinfo.hIcon)
Else
    appIcon = SystemIcons.Application
End If

 これにより、上記画面の のアイコン画像を設定できる。

バージョン情報を設定するには?

 後は取得したこれらの情報を次のようなコードにより各コントロールに対して設定すれば完成だ。

// C#
// ラベルなどにバージョン情報をセット
pictureBox1.Image = appIcon.ToBitmap();
Text = appProductName + " のバージョン情報";
label1.Text = appCompanyName + " " + appProductName;
label2.Text = "Version " + appVersion;
label3.Text = appCopyright;
label4.Text = appDescription;
' VB.NET
' ラベルなどにバージョン情報をセット
pictureBox1.Image = appIcon.ToBitmap()
Text = appProductName & " のバージョン情報"
label1.Text = appCompanyName & " " & appProductName
label2.Text = "Version " & appVersion
label3.Text = appCopyright
label4.Text = appDescription

 以上のコード内容で作成したサンプルの[バージョン情報]ダイアログは、下のリンクよりダウンロードできる。

 このサンプルを利用して、ぜひ独自の[バージョン情報]ダイアログを作成してほしい。End of Article

カテゴリ:Windowsフォーム 処理対象:ダイアログ・ボックス
使用ライブラリ:Applicationクラス(System.Windows.Forms名前空間)
使用ライブラリ:Versionクラス(System名前空間)
使用ライブラリ:Assemblyクラス(System.Reflection名前空間)
使用ライブラリ:AssemblyInformationalVersion属性(System.Reflection名前空間)
使用ライブラリ:AssemblyProduct属性(System.Reflection名前空間)
使用ライブラリ:AssemblyCompany属性(System.Reflection名前空間)
使用ライブラリ:AssemblyCopyright属性(System.Reflection名前空間)
使用ライブラリ:AssemblyDescription属性(System.Reflection名前空間)
関連TIPS:モーダル・ダイアログやモードレス・ダイアログを表示するには?
関連TIPS:アセンブリにバージョン情報を設定するには?
関連TIPS:C#やVB.NETでキーワードを識別子として使用するには?
関連TIPS:実行ファイルからアプリケーションのアイコンを取得するには?
 
この記事と関連性の高い別の.NET TIPS
Visual Studio 2005でバージョン情報を設定するには?
アセンブリ・バージョンとファイル・バージョンを一致させるには?
アセンブリにバージョン情報を設定するには?
複数のプロジェクトでファイルを共有するには?
実行ファイルのパスを取得するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間