.NETにおけるバージョン情報の種類、またそれらを設定する方法取得する方法について。

バージョン情報に関するアセンブリ属性・プロジェクトプロパティ

.NETにおけるバージョン情報は以下に挙げるようにいくつかの種類があり、それぞれ意味や役割、設定できる値が異なっている。

アセンブリにバージョン情報を埋め込むための属性と、対応するプロジェクトファイルのプロパティ、またその意味と役割は次のとおり。

バージョン情報に関するアセンブリ属性・プロジェクトプロパティ
アセンブリ属性 プロジェクトプロパティの要素 意味・役割
AssemblyVersion <AssemblyVersion> アセンブリのバージョン。 構成ファイルを使ったバージョン指定や、アセンブリがGACで管理される場合に使用される値。

major.minor.build.revisionの形式でバージョンを指定する。

buildrevisionにはワイルドカード*を指定することができ、コンパイラに自動的に値を決定させることもできる。 ただし、.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)としてバージョン情報を記述することで埋め込むことができる。

プロジェクトファイルにバージョン情報を記述する例
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
    <OutputType>Library</OutputType>

    <AssemblyVersion>1.2</AssemblyVersion>
    <AssemblyFileVersion>4.3.2.1</AssemblyFileVersion>
  </PropertyGroup>
</Project>

ソースファイルに属性として記述する方法をとることもできるが、各バージョン情報はプロジェクトファイルまたはソースファイルのどちらか一方のみに記述でき、重複する場合はコンパイルエラーとなる。 (§.AssemblyInfoファイルの自動生成 (<GenerateAssemblyInfo>)§.自動生成されるアセンブリ属性の個別制御 (<Generate***Attribute>))

AssemblyInfoファイルでの設定

.NET Frameworkでは、AssemblyInfo.cs/AssemblyInfo.vbなどのソースファイルにアセンブリ属性としてバージョン情報を記述することで埋め込むことができる。

ファイル名は任意だが、一般的にはファイル名をAssemblyInfoとし、ここにすべてのアセンブリ属性を記述する。

ソースファイルにバージョン情報を記述する例
using System.Reflection;

[assembly: AssemblyVersion("1.2.*")]
[assembly: AssemblyFileVersion("4.3.2.1")]
ソースファイルにバージョン情報を記述する例
Imports System.Reflection

<Assembly: AssemblyVersion("1.2.*")>
<Assembly: AssemblyFileVersion("4.3.2.1")>

.NET/.NET Coreにてソースファイルにアセンブリ属性として埋め込む場合は、自動生成されるAssemblyInfoファイルと重複しないようにする必要がある。 (§.AssemblyInfoファイルの自動生成 (<GenerateAssemblyInfo>)§.自動生成されるアセンブリ属性の個別制御 (<Generate***Attribute>))

バージョン情報の設定に関連するプロジェクト設定

AssemblyInfoファイルの自動生成 (<GenerateAssemblyInfo>)

.NET/.NET Core形式のプロジェクトファイルで<GenerateAssemblyInfo>の指定を省略した場合は、既定値としてtrue(AssemblyInfoファイルの自動生成が有効)となる。

AssemblyInfoファイルの自動生成が有効な場合、プロジェクトファイルで設定されているアセンブリ情報がアセンブリ属性に展開され、ソースファイルとして自動生成される。 この状態でプロジェクトファイルとソースファイルの両方で同一のバージョン情報を指定しようとすると、アセンブリ属性の重複が起こることになり、次のようにビルドエラーとなる。

obj/Debug/net5.0/TestApplication.AssemblyInfo.cs(16,12): error CS0579: System.Reflection.AssemblyInformationalVersionAttribute' 属性が重複しています。 [/home/smdn/assemblyversion/TestApplication.csproj]
obj/Debug/net5.0/TestApplication.AssemblyInfo.cs(19,12): error CS0579: System.Reflection.AssemblyVersionAttribute' 属性が重複しています。 [/home/smdn/assemblyversion/TestApplication.csproj]

ビルドに失敗しました。

バージョン情報に限らず、<Title>や<Description>などのアセンブリ情報がプロジェクトファイルとソースファイルの両方で重複する場合も同様にビルドエラーとなる。

自動生成されるアセンブリ属性の個別制御 (<Generate***Attribute>)

AssemblyInfoファイルの自動生成では、自動生成の対象となるプロパティ/アセンブリ属性を個別に制御することもできる。 例えばAssemblyFileVersionAttributeの場合は<GenerateAssemblyFileVersionAttribute>のように、<Generate***Attribute>プロパティを指定することにより、対応する属性の自動生成を有効にするか否かを個別に指定することができる。

これを用いることで、プロジェクトファイルとAssemblyInfoファイルの両方でアセンブリ情報を設定することもできる。 ただし、これにより重複が起こる場合は当然ビルドエラーとなる。

ソースファイルにバージョン情報の一部を記述する
using System.Reflection;

// AssemblyFileVersionとAssemblyInformationalVersionをソースファイル(アセンブリ属性)で設定する
[assembly: AssemblyFileVersion("4.3.2.1")]
[assembly: AssemblyInformationalVersion("1.0 beta")]
ソースファイルにバージョン情報の一部を記述する
Imports System.Reflection

' AssemblyFileVersionとAssemblyInformationalVersionをソースファイル(アセンブリ属性)で設定する
<Assembly: AssemblyFileVersion("4.3.2.1")>
<Assembly: AssemblyInformationalVersion("1.0 beta")>
プロジェクトファイルにバージョン情報の一部を記述する
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
    <OutputType>Exe</OutputType>

    <!-- AssemblyInfoファイルの自動生成を有効にする -->
    <GenerateAssemblyInfo>true</GenerateAssemblyInfo>

    <!-- AssemblyVersionをプロジェクトプロパティで設定する -->
    <AssemblyVersion>1.2</AssemblyVersion>

    <!-- AssemblyFileVersionとAssemblyInformationalVersionを -->
    <!-- ソースファイルで設定するため、自動生成を個別に無効化する -->
    <GenerateAssemblyFileVersionAttribute>false</GenerateAssemblyFileVersionAttribute>
    <GenerateAssemblyInformationalVersionAttribute>false</GenerateAssemblyInformationalVersionAttribute>
  </PropertyGroup>
</Project>

このプロパティはAssemblyTitleAttributeAssemblyDescriptionAttributeなどのアセンブリ属性に対しても同様に適用できる。

決定論的ビルド (<Deterministic>)

.NET/.NET Core形式のプロジェクトファイルで<Deterministic>の指定を省略した場合は、既定値としてtrue(決定論的ビルドが有効)となる。 この状態でAssemblyVersionにワイルドカード*を含めて自動決定させると、次のようにビルドエラーとなる。

obj/Debug/net5.0/TestApplication.AssemblyInfo.cs(19,55): error CS8357: 指定されたバージョン文字列には、決定性と互換性のないワイルドカードが含まれています。バージョン文字列からワイルドカードを削除するか、このコンパイルの決定性を無効にしてください。 [/home/smdn/assemblyversion/TestApplication.csproj]

ビルドに失敗しました。

バージョン情報の取得方法

コード上からアセンブリのバージョン情報を取得する方法は、取得したいバージョン情報の種類によっていくつか方法がある。 それぞれ次のメソッド・プロパティで取得することができる。

取得したいバージョン情報 取得できるメソッド・プロパティ
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を取得するコード
using System;
using System.Reflection;

class Sample {
  static void Main()
  {
    // 現在実行しているアセンブリ(.exeのアセンブリ)を取得する
    var assm = Assembly.GetExecutingAssembly();

    // AssemblyNameを取得する
    var name = assm.GetName();

    // 名前とバージョンを取得して表示する
    Console.WriteLine("{0} {1}", name.Name, name.Version);
  }
}
AssemblyInfo.cs
using System.Reflection;

[assembly: AssemblyVersion("1.2.*")] // AssemblyName.Versionではこの値が取得される
AssemblyVersionを取得するコード
Imports System
Imports System.Reflection

Class Sample
  Shared Sub Main()
    ' 現在実行しているアセンブリ(.exeのアセンブリ)を取得する
    Dim assm As [Assembly] = [Assembly].GetExecutingAssembly()

    ' AssemblyNameを取得する
    Dim name As AssemblyName = assm.GetName()

    ' 名前とバージョンを取得して表示する
    Console.WriteLine("{0} {1}", name.Name, name.Version)
  End Sub
End Class
AssemblyInfo.vb
Imports System.Reflection

<Assembly: AssemblyVersion("1.2.*")> ' AssemblyName.Versionではこの値が取得される
.NET Frameworkでの実行結果
E:\>csc /out:TestApplication.exe AssemblyInfo.cs test.cs & TestApplication.exe
TestApplication 1.2.4834.43060
Monoでの実行結果
$mcs -out:TestApplication.exe AssemblyInfo.cs test.cs && mono TestApplication.exe 
TestApplication 1.2.4834.42292

AssemblyVersion属性でアスタリスクを使ってバージョンを指定した場合は、ビルド時の時間を元に自動的に決定される。


AssemblyVersionをAssemblyInfoではなくプロジェクトファイルで指定した場合。 (取得用のコードは上記と同じ)

プロジェクトファイルの設定内容
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
    <OutputType>Exe</OutputType>
    <!-- AssemblyName.Versionでは以下の値が取得される -->
    <AssemblyVersion>1.2.*</AssemblyVersion>
    <Deterministic>false</Deterministic>
  </PropertyGroup>
</Project>
.NET 5での実行結果
>dotnet run
TestApplication 1.2.7400.5273

AssemblyVersionプロパティでアスタリスクを使ってバージョンを指定した場合は、ビルド時の時間を元に自動的に決定される。 バージョンを自動的に決定する場合は、決定論的ビルド(Deterministic)を無効にする必要がある。

Attribute.GetCustomAttribute

Attribute.GetCustomAttributeメソッドを使ってアセンブリ属性を取得することで、追加的なバージョン情報(InformationalVersion)アセンブリのファイルバージョン(FileVersion)を取得することができる。 アセンブリバージョン(AssemblyVersion)は属性自体の取得ができないため、このメソッドでは取得できない。

Attribute.GetCustomAttributeメソッドを使ってバージョン情報を取得するコード
using System;
using System.Reflection;

class Sample {
  static void Main()
  {
    // 現在実行しているアセンブリ(.exeのアセンブリ)を取得する
    var assm = Assembly.GetExecutingAssembly();

    // AssemblyVersion属性の値を取得しようとする (実際には取得できない)
    Console.WriteLine("AssemblyVersion: {0}", assm.GetCustomAttribute<AssemblyVersionAttribute>()?.Version);

    // AssemblyFileVersion属性の値を取得する
    Console.WriteLine("AssemblyFileVersion: {0}", assm.GetCustomAttribute<AssemblyFileVersionAttribute>()?.Version);

    // AssemblyInformationalVersion属性の値を取得する
    Console.WriteLine("AssemblyInformationalVersion: {0}", assm.GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion);
  }
}
AssemblyInfo.cs
using System.Reflection;

[assembly: AssemblyVersion("1.2.*")]
[assembly: AssemblyFileVersion("4.3.2.1")]
[assembly: AssemblyInformationalVersion("9.9.9.9")]
Attribute.GetCustomAttributeメソッドを使ってバージョン情報を取得するコード
Imports System
Imports System.Reflection

Class Sample
  Shared Sub Main()
    ' 現在実行しているアセンブリ(.exeのアセンブリ)を取得する
    Dim assm As [Assembly] = [Assembly].GetExecutingAssembly()

    ' AssemblyVersion属性の値を取得しようとする (実際には取得できない)
    Console.WriteLine("AssemblyVersion: {0}", assm.GetCustomAttribute(Of AssemblyVersionAttribute)?.Version)

    ' AssemblyFileVersion属性の値を取得する
    Console.WriteLine("AssemblyFileVersion: {0}", assm.GetCustomAttribute(Of AssemblyFileVersionAttribute)?.Version)

    ' AssemblyInformationalVersion属性の値を取得する
    Console.WriteLine("AssemblyInformationalVersion: {0}", assm.GetCustomAttribute(Of AssemblyInformationalVersionAttribute)?.InformationalVersion)
  End Sub
End Class
AssemblyInfo.vb
Imports System.Reflection

<Assembly: AssemblyVersion("1.2.*")>
<Assembly: AssemblyFileVersion("4.3.2.1")>
<Assembly: AssemblyInformationalVersion("9.9.9.9")>
.NET Frameworkでの実行結果
E:\>csc AssemblyInfo.cs test.cs /out:TestApplication.exe & TestApplication.exe
AssemblyVersion: 
AssemblyFileVersion: 4.3.2.1
AssemblyInformationalVersion: 9.9.9.9
Monoでの実行結果
$mcs AssemblyInfo.cs test.cs -out:TestApplication.exe && mono TestApplication.exe 
AssemblyVersion: 
AssemblyFileVersion: 4.3.2.1
AssemblyInformationalVersion: 9.9.9.9

AssemblyVersionをAssemblyInfoではなくプロジェクトファイルで指定した場合。 (取得用のコードは上記と同じ)

プロジェクトファイルの設定内容
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
    <OutputType>Exe</OutputType>
    <AssemblyVersion>1.2.*</AssemblyVersion>
    <FileVersion>4.3.2.1</FileVersion>
    <InformationalVersion>9.9.9.9</InformationalVersion>
    <Deterministic>false</Deterministic>
  </PropertyGroup>
</Project>
.NET 5での実行結果
>dotnet run
AssemblyVersion: 
AssemblyFileVersion: 4.3.2.1
AssemblyInformationalVersion: 9.9.9.9

FileVersionInfo.GetVersionInfo

FileVersionInfo.GetVersionInfoメソッドからは、アセンブリのファイルバージョン(FileVersion)を取得することができる。 ただし、ファイルバージョンが取得できるのはWindows上で実行した場合のみで、Windows以外ではアセンブリバージョン(AssebmlyVersion)が返される。

FileVersionInfo.GetVersionInfoメソッドにアセンブリ自身のファイルパスを指定してファイルのバージョン情報を表すFileVersionInfoを取得し、FileVersionInfo.FileVersionプロパティを参照すればアセンブリのファイルバージョンを取得できる。 なお、このプロパティから取得できるバージョン情報は、Versionクラスではなく文字列型になっている点に注意。

FileVersionInfo.GetVersionInfoメソッドに渡すアセンブリのファイルパスは、Assembly.Locationプロパティを参照して取得できる。

FileVersionInfo.GetVersionInfoメソッドを使ってAssemblyFileVersionを取得するコード
using System;
using System.Diagnostics;
using System.Reflection;

class Sample {
  static void Main()
  {
    // 現在実行しているアセンブリ(.exeのアセンブリ情報)を取得する
    var assm = Assembly.GetExecutingAssembly();

    // アセンブリのファイルパスを取得する
    var path = assm.Location;

    // アセンブリのFileVersionInfoを取得する
    var versionInfo = FileVersionInfo.GetVersionInfo(path);

    // ファイル名とバージョンを取得して表示する
    Console.WriteLine("{0} {1}", versionInfo.FileName, versionInfo.FileVersion);
  }
}
AssemblyInfo.cs
using System.Reflection;

// FileVersionInfo.GetVersionInfoでは以下どちらかの値が取得される
[assembly: AssemblyFileVersion("4.3.2.1")] // Windows上またはMonoではこの値が取得される
[assembly: AssemblyVersion("1.2.*")] // Windows以外ではこの値が取得される
FileVersionInfo.GetVersionInfoメソッドを使ってAssemblyFileVersionを取得するコード
Imports System
Imports System.Diagnostics
Imports System.Reflection

Class Sample
  Shared Sub Main()
    ' 現在実行しているアセンブリ(.exeのアセンブリ)を取得する
    Dim assm As [Assembly] = [Assembly].GetExecutingAssembly()

    ' アセンブリのファイルパスを取得する
    Dim path As String = assm.Location

    ' アセンブリのFileVersionInfoを取得する
    Dim versionInfo As FileVersionInfo = FileVersionInfo.GetVersionInfo(path)

    ' ファイル名とバージョンを取得して表示する
    Console.WriteLine("{0} {1}", versionInfo.FileName, versionInfo.FileVersion)
  End Sub
End Class
AssemblyInfo.vb
Imports System.Reflection

' FileVersionInfo.GetVersionInfoでは以下どちらかの値が取得される
<Assembly: AssemblyFileVersion("4.3.2.1")> ' Windows上またはMonoではこの値が取得される
<Assembly: AssemblyVersion("1.2.*")> ' Windows以外ではこの値が取得される
.NET Frameworkでの実行結果
E:\>csc /out:TestApplication.exe AssemblyInfo.cs test.cs & TestApplication.exe
E:\TestApplication.exe 4.3.2.1
Monoでの実行結果
$mcs -out:TestApplication.exe AssemblyInfo.cs test.cs && mono TestApplication.exe 
/home/smdn/TestApplication.exe 4.3.2.1

AssemblyVersionをAssemblyInfoではなくプロジェクトファイルで指定した場合。 (取得用のコードは上記と同じ)

プロジェクトファイルの設定内容
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
    <OutputType>Exe</OutputType>
    <!-- FileVersionInfo.GetVersionInfoでは以下どちらかの値が取得される -->
    <AssemblyFileVersion>4.3.2.1</AssemblyFileVersion> <!-- Windows上またはMonoではこの値が取得される -->
    <AssemblyVersion>1.2</AssemblyVersion> <!-- Windows以外ではこの値が取得される -->
  </PropertyGroup>
</Project>
Windows上の.NET 5での実行結果
>dotnet run
C:\Users\smdn\TestApplication\bin\Debug\net5.0\TestApplication.dll 4.3.2.1
Linux上の.NET 5での実行結果
$dotnet run
/home/smdn/TestApplication/bin/Debug/net5.0/TestApplication.dll 1.2

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に設定されている既定値を返す。

Application.ProductVersionから取得できる値
実装 取得できる値(優先順位の高い順)
.NET Framework 1. InformationalVersion
2. FileVersion
.NET/.NET Core 1. InformationalVersion
2. Version

Application.ProductVersionは、アプリケーションのエントリポイントを含むアセンブリ(Assembly.GetEntryAssemblyで取得されるアセンブリ)の情報を返すので、当然他のアセンブリのバージョン情報を取得することはできない。


.NET Frameworkの実装では、追加的なバージョン情報(InformationalVersion)またはアセンブリのファイルバージョン(FileVersion)を取得することができる。

Application.ProductVersionプロパティを使ってバージョン情報を取得するコード
using System;
using System.Windows.Forms;

class Sample {
  static void Main()
  {
    // Applicationクラスのプロパティを参照してバージョン情報を取得する
    Console.WriteLine("{0} {1}", Application.ProductName, Application.ProductVersion);
  }
}
AssemblyInfo.cs
using System.Reflection;

[assembly: AssemblyVersion("1.2.*")]

// Application.ProductVersionでは以下のいずれかの値が取得される
[assembly: AssemblyFileVersion("4.3.2.1")]
//[assembly: AssemblyInformationalVersion("9.9.9.9")]
Application.ProductVersionプロパティを使ってバージョン情報を取得するコード
Imports System
Imports System.Windows.Forms

Class Sample
  Shared Sub Main()
    ' Applicationクラスのプロパティを参照してバージョン情報を取得する
    Console.WriteLine("{0} {1}", Application.ProductName, Application.ProductVersion)
  End Sub
End Class
AssemblyInfo.vb
Imports System.Reflection

<Assembly: AssemblyVersion("1.2.*")>

' Application.ProductVersionでは以下のいずれかの値が取得される
<Assembly: AssemblyFileVersion("4.3.2.1")>
' <Assembly: AssemblyInformationalVersion("9.9.9.9")>
.NET Frameworkでの実行結果
E:\>csc /out:TestApplication.exe AssemblyInfo.cs test.cs & TestApplication.exe
E:\TestApplication.exe 4.3.2.1
Monoでの実行結果
$mcs -out:TestApplication.exe AssemblyInfo.cs test.cs && mono TestApplication.exe 
/home/smdn/TestApplication.exe 4.3.2.1

.NET/.NET Coreの実装では、追加的なバージョン情報(InformationalVersion)を取得することができる。 InformationalVersionが設定されていない場合はVersionに設定されている既定値が返される。

プロジェクトファイルの設定内容
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net5-windows</TargetFramework>
    <OutputType>WinExe</OutputType>
    <UseWindowsForms>true</UseWindowsForms>
    <!-- Application.ProductVersionプロパティでは以下の値が取得される -->
    <InformationalVersion>1.0 beta</InformationalVersion>
    <!-- Application.ProductVersionプロパティでは以下の値は取得されない -->
    <AssemblyVersion>1.2.3.4</AssemblyVersion>
    <FileVersion>4.3.2.1</FileVersion>
  </PropertyGroup>
</Project>

取得用のコードは上記と同じものを使用。

.NET 5での実行結果
>dotnet bin\Debug\net5-windows\TestApplication.dll
TestApplication 1.0 beta

AssemblyInformationalVersionにはmajor.minor.build.revision以外の形式、任意の文字列を指定することが許容される。 そのため、Application.ProductVersionプロパティから取得できる値は、必ずしもVersionクラスに変換できるとは限らないので注意する必要がある。

using System;
using System.Reflection;
using System.Windows.Forms;

[assembly: AssemblyVersion("1.2.*")]
[assembly: AssemblyFileVersion("4.3.2.1")]
[assembly: AssemblyInformationalVersion("1.0 beta")] // major.minor.build.revisionの形式ではないバージョン表記を指定する

class Sample {
  static void Main()
  {
    Console.WriteLine("{0} {1}", Application.ProductName, Application.ProductVersion);

    // Application.ProductVersionで得られるバージョン文字列をVersionクラスに変換しようとする
    var version = Version.Parse(Application.ProductVersion); // FormatExceptionがスローされる
  }
}
Imports System
Imports System.Reflection
Imports System.Windows.Forms

<Assembly: AssemblyVersion("1.2.*")>
<Assembly: AssemblyFileVersion("4.3.2.1")>
<Assembly: AssemblyInformationalVersion("1.0 beta")> ' major.minor.build.revisionの形式ではないバージョン表記を指定する

Class Sample
  Shared Sub Main()
    Console.WriteLine("{0} {1}", Application.ProductName, Application.ProductVersion)

    ' Application.ProductVersionで得られるバージョン文字列をVersionクラスに変換しようとする
    Dim version As Version = Version.Parse(Application.ProductVersion) ' FormatExceptionがスローされる
  End Sub
End Class