2020-09-14 (月)
[C#] AssemblyInfo アセンブリ情報やバージョンを取得する (.NET Core比較版)
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 プロパティ | AssemblyName | Attribute | FileVersionInfo |
---|---|---|---|---|
アセンブリ名 | AssemblyName | ○ | ||
タイトル | AssemblyTitle | ○ | ○ | |
説明 | Description | ○ | ||
会社 | Company | ○ | ○ | |
製品 | Product | ○ | ○ | |
著作権 | Copyright | ○ | ○ | |
商標 | AssemblyTrademark | ○ | ○ | |
アセンブリ Ver | AssemblyVersion | ○ | ||
ファイル Ver | FileVersion | ○ | ○ | |
製品 Ver | InformationalVersion | ○ | ○ | |
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 (月)
関連記事
新着記事