ざこノート
2018-05-17 [C# ]

[C#] アセンブリ情報やバージョンを取得する

AssemblyName、FileVersionInfo、CustomAttribute の3つの方法で取得します。
自分自身のアセンブリ情報と3つのバージョン(アセンブリ・ファイル・製品)を取得します。

環境

  • Windows 10 Pro 64bit 1709
  • Visual Studio Community 2017 15.5.7
  • .NET Framework 4.6.1
  • C# 7.0

結果

プロジェクトのプロパティ設定です。

プロジェクトのプロパティ設定

製品バージョン(AssemblyInformationalVersion)だけはAssemblyInfo.csに直接記述しました。

AssemblyInfo.cs

[assembly: AssemblyTitle("タイトル")]
[assembly: AssemblyDescription("説明")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("会社")]
[assembly: AssemblyProduct("製品")]
[assembly: AssemblyCopyright("著作権")]
[assembly: AssemblyTrademark("商標")]
[assembly: AssemblyCulture("")]
[assembly: ComVisible(false)]
[assembly: AssemblyVersion("1.0.0.0")] // アセンブリバージョン
[assembly: AssemblyFileVersion("2.0.0.0")] // ファイルバージョン
[assembly: AssemblyInformationalVersion("3.0.0.0")] // 製品バージョン
[assembly: Guid("00000000-1111-2222-3333-444444444444")]
[assembly: NeutralResourcesLanguage("ja-JP")]

3つの方法で取得します。

// 1. AssemblyName
Assembly.GetExecutingAssembly().GetName();
// 2. FileVersionInfo
FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location);
// 3. CustomAttribute
(T)Attribute.GetCustomAttribute(Assembly.GetExecutingAssembly(), typeof(T))

各取得できる項目です。

項目 AssemblyName FileVersionInfo Attribute
アセンブリ名
タイトル
説明
会社
製品
著作権
商標
アセンブリ Ver
ファイル Ver
製品 Ver
GUID
ニュートラル言語
COM参照可能
(実行速度) 早い かなり遅い 遅い

(実行速度)
FileVersionInfoはファイルIOが遅く、Attributeはリフレクションで遅いのだと思います。

アセンブリ名とタイトルが同じで、3種類のバージョンも同じという場合は、以下のように取得すれば良いと思います。

var assembly = Assembly.GetExecutingAssembly().GetName();
var ver = assembly.Version;

// アセンブリ名 1.0.0.0
return $"{assembly.Name} {ver.Major}.{ver.Minor}.{ver.Build}.{ver.Revision}";

実装

全ての項目を取得

using System;
using System.Diagnostics;
using System.Reflection;

public void Get()
{
    var assembly = Assembly.GetExecutingAssembly();

    // 1. AssemblyName
    var assemblyName = assembly.GetName();
    // 2. FileVersionInfo
    var fileVersionInfo = FileVersionInfo.GetVersionInfo(assembly.Location);
    // 3. Attribute
    T GetCustomAttribute<T>() where T : Attribute =>
        (T)Attribute.GetCustomAttribute(assembly, typeof(T));

    // AssemblyName = "アセンブリ名"
    var n1 = assemblyName.Name;

    // AssemblyTitle = "タイトル"
    var t1 = GetCustomAttribute<AssemblyTitleAttribute>().Title;
    var t2 = fileVersionInfo.FileDescription;

    // AssemblyDescription = "説明"
    var d1 = GetCustomAttribute<AssemblyDescriptionAttribute>().Description;
    var d2 = fileVersionInfo.Comments;

    // AssemblyCompany = "会社"
    var c1 = GetCustomAttribute<AssemblyCompanyAttribute>().Company;
    var c2 = fileVersionInfo.CompanyName;

    // AssemblyProduct = "製品"
    var p1 = GetCustomAttribute<AssemblyProductAttribute>().Product;
    var p2 = fileVersionInfo.ProductName;

    // AssemblyCopyright = "著作権"
    var r1 = GetCustomAttribute<AssemblyCopyrightAttribute>().Copyright;
    var r2 = fileVersionInfo.LegalCopyright;

    // AssemblyTrademark = "商標"
    var m1 = GetCustomAttribute<AssemblyTrademarkAttribute>().Trademark;
    var m2 = fileVersionInfo.LegalTrademarks;

    // NeutralResourcesLanguage = "ja-JP"
    var l1 = GetCustomAttribute<NeutralResourcesLanguageAttribute>().CultureName;

    // GUID = "00000000-1111-2222-3333-444444444444"
    var g1 = GetCustomAttribute<GuidAttribute>().Value;

    // ComVisible(COM参照可能) = "false"
    var o1 = GetCustomAttribute<ComVisibleAttribute>().Value;

    // AssemblyVersion = "1.0.0.0"
    Version v1 = assemblyName.Version;
    //GetCustomAttribute<AssemblyVersionAttribute>()?.Version; // null

    // AssemblyFileVersion = "2.0.0.0"
    string f2 = fileVersionInfo.FileVersion;
    string v2 = GetCustomAttribute<AssemblyFileVersionAttribute>().Version;

    // AssemblyInformationalVersion(製品バージョン) = "3.0.0.0"
    string f3 = fileVersionInfo.ProductVersion;
    string v3 = GetCustomAttribute<AssemblyInformationalVersionAttribute>().InformationalVersion;
}

AssemblyNameで取得

var assemblyName = Assembly.GetExecutingAssembly().GetName();

var n1 = assemblyName.Name;    // "アセンブリ名"
var v1 = assemblyName.Version; // "1.0.0.0"

FileVersionInfoで取得

var fileVersionInfo = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location);

var t2 = fileVersionInfo.FileDescription; // "タイトル"
var d2 = fileVersionInfo.Comments;        // "説明"
var c2 = fileVersionInfo.CompanyName;     // "会社"
var p2 = fileVersionInfo.ProductName;     // "製品"
var r2 = fileVersionInfo.LegalCopyright;  // "著作権"
var m2 = fileVersionInfo.LegalTrademarks; // "商標"
var f2 = fileVersionInfo.FileVersion;     // "2.0.0.0"
var f3 = fileVersionInfo.ProductVersion;  // "3.0.0.0"

Attributeで取得

var assembly = Assembly.GetExecutingAssembly();

T GetCustomAttribute<T>() where T : Attribute =>
    (T)Attribute.GetCustomAttribute(assembly, typeof(T));

var t1 = GetCustomAttribute<AssemblyTitleAttribute>().Title;                  // "タイトル"
var d1 = GetCustomAttribute<AssemblyDescriptionAttribute>().Description;      // "説明"
var c1 = GetCustomAttribute<AssemblyCompanyAttribute>().Company;              // "会社"
var p1 = GetCustomAttribute<AssemblyProductAttribute>().Product;              // "製品"
var r1 = GetCustomAttribute<AssemblyCopyrightAttribute>().Copyright;          // "著作権"
var m1 = GetCustomAttribute<AssemblyTrademarkAttribute>().Trademark;          // "商標"
var l1 = GetCustomAttribute<NeutralResourcesLanguageAttribute>().CultureName; // "ja-JP"
var g1 = GetCustomAttribute<GuidAttribute>().Value;                           // "00000000-1111-2222-3333-444444444444"
var o1 = GetCustomAttribute<ComVisibleAttribute>().Value;                     // "false"
var v2 = GetCustomAttribute<AssemblyFileVersionAttribute>().Version;                       // "2.0.0.0"
var v3 = GetCustomAttribute<AssemblyInformationalVersionAttribute>().InformationalVersion; // "3.0.0.0"

感謝