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クラスのほうが後発で、扱いは楽。利便性のために後から追加されたクラスといったところなのかな。