[C#] AssemblyInfo アセンブリ情報やバージョンを取得する (.NET Core比較版)

2020-09-14 (月)

AssemblyInfo を AssemblyName, CustomAttribute, FileVersionInfo の3つの方法で取得します。
自分自身のアセンブリ情報と3種類のバージョン(アセンブリ・ファイル・製品)を取得します。
.NET Framework での記述を .NET Core SDK ベース csproj に置き換えて記述した比較です。

本記事は、[C#] アセンブリ情報やバージョンを取得する のアクセス数が多かったため、.NET Coreとの比較版として書き直しました。
NuGet パッケージ に関することは考慮していません。

環境

  • Windows 10 Pro 64bit 1909
  • Visual Studio 2019 16.7.3
  • .NET Core 3.1
  • C# 8.0

結果

.NET Framework での設定

アセンブリ情報

AssemblyInfo.cs

using System.Resources;
using System.Reflection;
using System.Runtime.InteropServices;

[assembly: AssemblyTitle("タイトル")]
[assembly: AssemblyDescription("説明")]
[assembly: AssemblyCompany("会社")]
[assembly: AssemblyProduct("製品")]
[assembly: AssemblyCopyright("著作権")]
[assembly: AssemblyTrademark("商標")]
[assembly: AssemblyVersion("2.0.0.0")]
[assembly: AssemblyFileVersion("3.0.0.0")]
[assembly: AssemblyInformationalVersion("4.0.0.0")] // 製品バージョンだけ直接記述
[assembly: Guid("00000000-1111-2222-3333-444444444444")]
[assembly: NeutralResourcesLanguage("ja-JP")]
[assembly: ComVisible(true)]

ファイルプロパティ

.NET Core での設定

パッケージ

.csproj

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>

    <!-- NuGet メタデータ プロパティ (パッケージ画面で入力可能) -->
    <Company>会社</Company>
    <Product>製品</Product>
    <Description>説明</Description>
    <Copyright>著作権</Copyright>
    <NeutralLanguage>ja-JP</NeutralLanguage>
    <AssemblyVersion>2.0.0.0</AssemblyVersion>
    <FileVersion>3.0.0.0</FileVersion>

    <!-- AssemblyInfo プロパティ -->
    <AssemblyTitle>タイトル</AssemblyTitle>
    <InformationalVersion>4.0.0.0</InformationalVersion>
  </PropertyGroup>

</Project>

3種類のバージョンが同じの場合は、Versionのみ定義すれば良いです。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <!-- パッケージ バージョン (パッケージ画面で入力可能) -->
    <Version>1.2.3.4</Version>

    <!-- Version を定義していれば、以下は同じ値になるので定義不要 (定義すると上書きで有効になる)-->
    <AssemblyVersion>1.2.3.4</AssemblyVersion>
    <FileVersion>1.2.3.4</FileVersion>
    <InformationalVersion>1.2.3.4</InformationalVersion>
  </PropertyGroup>

</Project>

AssemblyInfo.cs

using System.Reflection;

// .csprojで設定不可の項目
// AssemblyInfo.cs 以外のところに定義してもOK
[assembly: AssemblyTrademark("商標")]
[assembly: ComVisible(true)]
[assembly: Guid("00000000-1111-2222-3333-444444444444")]

ファイルプロパティ

各項目と取得方法

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

// 1. AssemblyName
Assembly.GetExecutingAssembly().GetName();
// 2. CustomAttribute
Assembly.GetExecutingAssembly().GetCustomAttribute<T>();
// 3. FileVersionInfo
FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location);

取得できる各項目です。

項目csproj プロパティAssemblyNameAttributeFileVersionInfo
アセンブリ名AssemblyName
タイトルAssemblyTitle
説明Description
会社Company
製品Product
著作権Copyright
商標AssemblyTrademark
アセンブリ VerAssemblyVersion
ファイル VerFileVersion
製品 VerInformationalVersion
GUID
ニュートラル言語NeutralLanguage
COM参照可能
(実行速度)早い遅いかなり遅い

(実行速度) FileVersionInfoはファイルIOが遅く、Attributeはリフレクションで遅いのだと思います。
FileVersionInfoは、ファイルパスを指定して取得できる特徴があります。

実装

タイトルとバージョンのみを取得

3種類のバージョンが同じ前提で、タイトル 1.2.3というよくある形式を取得します。
タイトルがアセンブリ名が同じ場合は、AssemblyNameから取得します。

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

// アセンブリ名 1.2.3
return assembly.Name + " " + version.ToString(3);
// アセンブリ名 1.2.3.0
return $"{assembly.Name} {version.Major}.{version.Minor}.{version.Build}.{version.Revision}";

タイトルがアセンブリ名と異なる場合は、TitleをAttributeから取得します。

var assembly = Assembly.GetExecutingAssembly();
var title = assembly.GetCustomAttribute<AssemblyTitleAttribute>().Title;
var version = assembly.Version;

// タイトル 1.2.3
return title + " " + version.ToString(3);

全ての項目を取得

using System;
using System.Diagnostics;
using System.Reflection;
using System.Resources;
using System.Runtime.InteropServices;

static void Main(string[] args)
{
    var assembly = Assembly.GetExecutingAssembly();

    // 1. AssemblyName
    var assemblyName = assembly.GetName();
    // 3. FileVersionInfo
    var fileVersionInfo = FileVersionInfo.GetVersionInfo(assembly.Location);


    // AssemblyName = "GetAssemblyAttributes"
    var n1 = assemblyName.Name;

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

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

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

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

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

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

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

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

    // ComVisible(COM参照可能) = "true"
    bool com2 = assembly.GetCustomAttribute<ComVisibleAttribute>().Value;

    // AssemblyVersion = "2.0.0.0"
    Version v1 = assemblyName.Version;
    // string v2 = assembly.GetCustomAttribute<AssemblyVersionAttribute>()?.Version; // null

    // AssemblyFileVersion = "3.0.0.0"
    string fv2 = assembly.GetCustomAttribute<AssemblyFileVersionAttribute>().Version;
    string fv3 = fileVersionInfo.FileVersion;

    // AssemblyInformationalVersion(製品バージョン) = "4.0.0.0"
    string iv2 = assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>().InformationalVersion;
    string iv3 = fileVersionInfo.ProductVersion;
}

// 3. Attribute (.NET Framework 4.5より前の場合)
private static T GetCustomAttribute<T>(Assembly assembly) where T : Attribute
{
    // assembly.GetCustomAttribute<T>() 拡張メソッドが使えないため、このメソッドを使用して取得する
    return (T)Attribute.GetCustomAttribute(assembly, typeof(T));
}

AssemblyNameで取得

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

assemblyName.Name;     // "GetAssemblyAttributes"
assemblyName.Version;  // "2.0.0.0"

Attributeで取得

var assembly = Assembly.GetExecutingAssembly();

assembly.GetCustomAttribute<AssemblyTitleAttribute>().Title;                  // "タイトル"
assembly.GetCustomAttribute<AssemblyDescriptionAttribute>().Description;      // "説明"
assembly.GetCustomAttribute<AssemblyCompanyAttribute>().Company;              // "会社"
assembly.GetCustomAttribute<AssemblyProductAttribute>().Product;              // "製品"
assembly.GetCustomAttribute<AssemblyCopyrightAttribute>().Copyright;          // "著作権"
assembly.GetCustomAttribute<AssemblyTrademarkAttribute>().Trademark;          // "商標"
assembly.GetCustomAttribute<NeutralResourcesLanguageAttribute>().CultureName; // "ja-JP"
assembly.GetCustomAttribute<GuidAttribute>().Value;                           // "00000000-1111-2222-3333-444444444444"
assembly.GetCustomAttribute<ComVisibleAttribute>().Value;                     // "true"
assembly.GetCustomAttribute<AssemblyFileVersionAttribute>().Version;                       // "3.0.0.0"
assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>().InformationalVersion; // "4.0.0.0"

FileVersionInfoで取得

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

fileVersionInfo.FileDescription; // "タイトル"
fileVersionInfo.Comments;        // "説明"
fileVersionInfo.CompanyName;     // "会社"
fileVersionInfo.ProductName;     // "製品"
fileVersionInfo.LegalCopyright;  // "著作権"
fileVersionInfo.LegalTrademarks; // "商標"
fileVersionInfo.FileVersion;     // "3.0.0.0"
fileVersionInfo.ProductVersion;  // "4.0.0.0"

感謝

2020-09-14 (月)