.NETにおけるバージョン情報の種類、またそれらを設定する方法、取得する方法について。
バージョン情報に関するアセンブリ属性・プロジェクトプロパティ
.NETにおけるバージョン情報は以下に挙げるようにいくつかの種類があり、それぞれ意味や役割、設定できる値が異なっている。
アセンブリにバージョン情報を埋め込むための属性と、対応するプロジェクトファイルのプロパティ、またその意味と役割は次のとおり。
アセンブリ属性 | プロジェクトプロパティの要素 | 意味・役割 |
---|---|---|
AssemblyVersion | <AssemblyVersion> |
アセンブリのバージョン。 構成ファイルを使ったバージョン指定や、アセンブリがGACで管理される場合に使用される値。major.minor.build.revision の形式でバージョンを指定する。buildとrevisionにはワイルドカード * を指定することができ、コンパイラに自動的に値を決定させることもできる。 ただし、.NET/.NET Coreで自動的に決定させたい場合は、<Deterministic>をfalseを指定して決定論的ビルドを無効にする必要がある。 (§.決定論的ビルド (<Deterministic>))例: 1.0.0.0 , 1.0.* , 1.0.0.* , 1.0.*.* |
AssemblyFileVersion | <FileVersion> |
ファイルのバージョン。 Win32 EXE/DLLとしてのバージョン。 ファイルのプロパティダイアログに表示される[ファイルバージョン]の値を指定したい場合はこの値を設定する。major.minor.build.revision の形式でバージョンを指定する。 |
AssemblyInformationalVersion | <InformationalVersion> |
追加的なバージョン情報。 ユーザー向けに提示されるバージョン情報などを指定する。 ファイルのプロパティダイアログに表示される[製品バージョン]の値を指定したい場合はこの値を設定する。 特に形式は定められていないため、単にバージョンだけでなく、製品コードネームや対象プラットフォームなどヒューマンフレンドリな情報を付加することができる。 例: 1.0 beta1 'codename:Foo' (win64) |
(該当なし) | <PackageVersion> |
NuGetパッケージのバージョン。 アセンブリに埋め込まれるバージョン情報ではなく、NuGetパッケージとしてリリースする際に使用されるバージョンとして使用される。major.minor.patch , major.minor.patch-prerelease , major.minor.patch+build など、Semantic versioning 2.0.0の仕様に準拠する形式でバージョンを指定する。 (詳細:NuGet パッケージ バージョンのリファレンス | Microsoft Docs)例: 1.0.0 ,1.0.0-beta1 ,1.0.0+win64-githash |
(該当なし) | <Version> | 上記のプロパティの指定を省略した場合、このプロパティで指定された値が規定値として使用される。 逆にいえば、このプロパティに指定した値は、上記のプロパティで個別に上書きすることができる。major.minor.build.revision の形式でバージョンを指定する。 ワイルドカード* は指定できない。 |
アセンブリ属性 | プロジェクトプロパティの要素 | 意味・役割 |
Windowsのプロパティダイアログでは、「ファイルバージョン」欄でFileVersion、「製品バージョン」欄でInformationalVersionに設定されている値が表示される。
バージョン情報の設定方法
アセンブリにバージョン情報を含むメタデータを設定する方法について。 ここでは個々のIDE上での設定方法については扱わない。
プロジェクトファイルでの設定
.NET/.NET Core形式のプロジェクトファイル(*.csproj
, *.vbproj
など)では、プロジェクトのプロパティ(PropertyGroup
)としてバージョン情報を記述することで埋め込むことができる。
ソースファイルに属性として記述する方法をとることもできるが、各バージョン情報はプロジェクトファイルまたはソースファイルのどちらか一方のみに記述でき、重複する場合はコンパイルエラーとなる。 (§.AssemblyInfoファイルの自動生成 (<GenerateAssemblyInfo>)、§.自動生成されるアセンブリ属性の個別制御 (<Generate***Attribute>))
AssemblyInfoファイルでの設定
.NET Frameworkでは、AssemblyInfo.cs
/AssemblyInfo.vb
などのソースファイルにアセンブリ属性としてバージョン情報を記述することで埋め込むことができる。
ファイル名は任意だが、一般的にはファイル名をAssemblyInfo
とし、ここにすべてのアセンブリ属性を記述する。
.NET/.NET Coreにてソースファイルにアセンブリ属性として埋め込む場合は、自動生成されるAssemblyInfoファイルと重複しないようにする必要がある。 (§.AssemblyInfoファイルの自動生成 (<GenerateAssemblyInfo>)、§.自動生成されるアセンブリ属性の個別制御 (<Generate***Attribute>))
バージョン情報の設定に関連するプロジェクト設定
AssemblyInfoファイルの自動生成 (<GenerateAssemblyInfo>)
.NET/.NET Core形式のプロジェクトファイルで<GenerateAssemblyInfo>の指定を省略した場合は、既定値としてtrue
(AssemblyInfoファイルの自動生成が有効)となる。
AssemblyInfoファイルの自動生成が有効な場合、プロジェクトファイルで設定されているアセンブリ情報がアセンブリ属性に展開され、ソースファイルとして自動生成される。 この状態でプロジェクトファイルとソースファイルの両方で同一のバージョン情報を指定しようとすると、アセンブリ属性の重複が起こることになり、次のようにビルドエラーとなる。
バージョン情報に限らず、<Title>や<Description>などのアセンブリ情報がプロジェクトファイルとソースファイルの両方で重複する場合も同様にビルドエラーとなる。
自動生成されるアセンブリ属性の個別制御 (<Generate***Attribute>)
AssemblyInfoファイルの自動生成では、自動生成の対象となるプロパティ/アセンブリ属性を個別に制御することもできる。 例えばAssemblyFileVersionAttribute
の場合は<GenerateAssemblyFileVersionAttribute>のように、<Generate***Attribute>プロパティを指定することにより、対応する属性の自動生成を有効にするか否かを個別に指定することができる。
これを用いることで、プロジェクトファイルとAssemblyInfoファイルの両方でアセンブリ情報を設定することもできる。 ただし、これにより重複が起こる場合は当然ビルドエラーとなる。
このプロパティはAssemblyTitleAttribute
やAssemblyDescriptionAttribute
などのアセンブリ属性に対しても同様に適用できる。
決定論的ビルド (<Deterministic>)
.NET/.NET Core形式のプロジェクトファイルで<Deterministic>の指定を省略した場合は、既定値としてtrue
(決定論的ビルドが有効)となる。 この状態でAssemblyVersionにワイルドカード*
を含めて自動決定させると、次のようにビルドエラーとなる。
バージョン情報の取得方法
コード上からアセンブリのバージョン情報を取得する方法は、取得したいバージョン情報の種類によっていくつか方法がある。 それぞれ次のメソッド・プロパティで取得することができる。
取得したいバージョン情報 | 取得できるメソッド・プロパティ |
---|---|
AssebmlyVersion |
AssemblyName.Version
FileVersionInfo.GetVersionInfo (Windows以外) |
FileVersion |
Attribute.GetCustomAttribute
FileVersionInfo.GetVersionInfo (Windows上でのみ) Application.ProductVersion (.NET Frameworkのみ) |
InformationalVersion |
Attribute.GetCustomAttribute
Application.ProductVersion |
上記のように実行環境・ランタイムの種類によって取得される値が変わるものもある。 AssebmlyVersionならAssemblyName.Version、FileVersion・InformationalVersionならAttribute.GetCustomAttributeが確実かつ環境依存無しで取得できる方法となる。
AssemblyName.Version
AssemblyName.Versionプロパティからは、アセンブリバージョン(AssemblyVersion)を取得することができる。
Assembly.GetNameメソッドを使ってバージョン情報を取得したいアセンブリのAssemblyNameを取得し、AssemblyName.Versionプロパティを参照すればアセンブリのバージョン情報を取得できる。 このプロパティでは、バージョン情報をVersionクラスで取得することができる。
AssemblyVersion属性でアスタリスクを使ってバージョンを指定した場合は、ビルド時の時間を元に自動的に決定される。
AssemblyVersionをAssemblyInfoではなくプロジェクトファイルで指定した場合。 (取得用のコードは上記と同じ)
AssemblyVersionプロパティでアスタリスクを使ってバージョンを指定した場合は、ビルド時の時間を元に自動的に決定される。 バージョンを自動的に決定する場合は、決定論的ビルド(Deterministic)を無効にする必要がある。
Attribute.GetCustomAttribute
Attribute.GetCustomAttributeメソッドを使ってアセンブリ属性を取得することで、追加的なバージョン情報(InformationalVersion)とアセンブリのファイルバージョン(FileVersion)を取得することができる。 アセンブリバージョン(AssemblyVersion)は属性自体の取得ができないため、このメソッドでは取得できない。
AssemblyVersionをAssemblyInfoではなくプロジェクトファイルで指定した場合。 (取得用のコードは上記と同じ)
FileVersionInfo.GetVersionInfo
FileVersionInfo.GetVersionInfoメソッドからは、アセンブリのファイルバージョン(FileVersion)を取得することができる。 ただし、ファイルバージョンが取得できるのはWindows上で実行した場合のみで、Windows以外ではアセンブリバージョン(AssebmlyVersion)が返される。
FileVersionInfo.GetVersionInfoメソッドにアセンブリ自身のファイルパスを指定してファイルのバージョン情報を表すFileVersionInfoを取得し、FileVersionInfo.FileVersionプロパティを参照すればアセンブリのファイルバージョンを取得できる。 なお、このプロパティから取得できるバージョン情報は、Versionクラスではなく文字列型になっている点に注意。
FileVersionInfo.GetVersionInfoメソッドに渡すアセンブリのファイルパスは、Assembly.Locationプロパティを参照して取得できる。
AssemblyVersionをAssemblyInfoではなくプロジェクトファイルで指定した場合。 (取得用のコードは上記と同じ)
Application.ProductVersion
Application.ProductVersionプロパティからもバージョン情報を取得することができるが、.NET Frameworkと、.NET/.NET Coreでは取得できる値に違いがある。
Application.ProductVersionは、それぞれ次の優先順位でバージョン情報を取得し、取得できたものを返す。 例えば.NET FrameworkではInformationalVersionが設定されていなければFileVersionを、FileVersionが設定されていなければ既定値(1.0.0.0
)を返すが、.NET/.NET CoreではInformationalVersionが設定されていなければFileVersionではなくVersionに設定されている既定値を返す。
実装 | 取得できる値(優先順位の高い順) |
---|---|
.NET Framework | 1. InformationalVersion 2. FileVersion |
.NET/.NET Core | 1. InformationalVersion 2. Version |
Application.ProductVersionは、アプリケーションのエントリポイントを含むアセンブリ(Assembly.GetEntryAssemblyで取得されるアセンブリ)の情報を返すので、当然他のアセンブリのバージョン情報を取得することはできない。
.NET Frameworkの実装では、追加的なバージョン情報(InformationalVersion)またはアセンブリのファイルバージョン(FileVersion)を取得することができる。
.NET/.NET Coreの実装では、追加的なバージョン情報(InformationalVersion)を取得することができる。 InformationalVersionが設定されていない場合はVersionに設定されている既定値が返される。
取得用のコードは上記と同じものを使用。
AssemblyInformationalVersionにはmajor.minor.build.revision
以外の形式、任意の文字列を指定することが許容される。 そのため、Application.ProductVersionプロパティから取得できる値は、必ずしもVersionクラスに変換できるとは限らないので注意する必要がある。