遅い→起動時

http://d.hatena.ne.jp/pmint/

WPFでアプリケーション名を取得するコード

正確にはアセンブリ名なんだけど。

System.Reflection.Assembly.GetExecutingAssembly().GetName().Name
→ "AssemblyInfo1" (…というアプリケーション名)

だったら自分でアセンブリ情報(AssemblyInfo)にアプリケーション名を書いて、それを普通に読んだほうがいいのか。


アセンブリ情報(AssemblyInfo)を読むコード(C#)

プロジェクトテンプレートは「WPFアプリケーション」を使用している。

MainWindow.xaml.cs
using System.Windows;

namespace AssemblyInfo1
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            var info = new Microsoft.VisualBasic.ApplicationServices.AssemblyInfo(System.Reflection.Assembly.GetExecutingAssembly());
        }
    }
}

結果

> はイミディエイトウィンドウでの入力)

> info
{Microsoft.VisualBasic.ApplicationServices.AssemblyInfo}
    AssemblyName: "AssemblyInfo1"
    CompanyName: "アセンブリ情報.会社"
    Copyright: "アセンブリ情報.著作権"
    Description: "アセンブリ情報.説明"
    DirectoryPath: (略)
    LoadedAssemblies: Count = 22
    ProductName: "アセンブリ情報.製品"
    StackTrace: (略)
    Title: "アセンブリ情報.タイトル"
    Trademark: "アセンブリ情報.商標"
    Version: {1.2.3.4}
    WorkingSet: 28131328

> info.ProductName
"アセンブリ情報.製品"

> info.Version
{1.2.3.4}
    Build: 3
    Major: 1
    MajorRevision: 0
    Minor: 2
    MinorRevision: 4
    Revision: 4

> info.Version.Major
1

> info.Version.ToString()
"1.2.3.4"

Versionはプロジェクトのプロパティ > アプリケーション > アセンブリ情報… にある「アセンブリ バージョン」のほう。
「ファイル バージョン」はここではなく System.Windows.Forms.Application.ProductVersion で得られる。(WPFじゃなくてWinForms側のライブラリだけど)
WPFアプリケーションでは「ファイル バージョン」より「アセンブリ バージョン」を使えってこと?統合されてないのはなぜだろう。
Revisionを16ビットずつ2分割した Version.MajorRevision, Version.MinorRevision も謎だけど。


AssemblyInfoは"Microsoft.VisualBasic"

AssemblyInfoを扱うライブラリがMicrosoft.VisualBasicの下位にあるのは「VisualBasicという製品」から受け継いだ要素だからではないかと推察。互換性至上主義のMicrosoftだし。


Microsoft.VisualBasic.ApplicationServices 名前空間 ()」によるとAssemblyInfoは「Visual Basic アプリケーション モデル」に含まれる要素らしい。

Visual Basic アプリケーション モデルの概要」によると、Visual Basicアプリケーションモデルは「Windows フォーム アプリケーションの動作を制御するための確たるモデル」らしい。その紹介として二重起動時に1つめに通知する機能を取り上げてる。WPFで同じことをしようとするとプロセスを探して→そのプロセスに属すウィンドウを調べて→そのウィンドウにWindowsメッセージを送る…とかやらないといけない。

「AssemblyInfoはWinFormsから受け継いだもので、それはVBの設計の1要素」といったところ?




DOBON.NET - "自分自身のバージョン情報を取得する" の "グローバル属性の情報を取得する"」にあるようにSystem.Reflection.AssemblyProductAttributeを使う方法もある。


MSDNのドキュメントにある「バージョン情報」を見ると…

AssemblyProductAttribute クラス (System.Reflection)
.NET Framework 1.0 から
AssemblyInfo クラス (Microsoft.VisualBasic.ApplicationServices)
.NET Framework 2.0 から


AssemblyInfoクラスのほうが後発で、扱いは楽。利便性のために後から追加されたクラスといったところなのかな。