※記事内に商品プロモーションを含むことがあります。
はじめに
C#でソフトウェアのバージョンを設定する方法をまとめた(C#の開発に使用するC#自体のバージョンや、.NETのバージョンを指定する方法ではない)。
環境は以下の通り。
- Windows 10 Home Version 2004
- Visual Studio Community 2019 (Version 16.6.2)
- C# Version 8.0
C#のバージョン概要
C#では、以下の3つのバージョンを設定できる。
- パッケージ バージョン
- アセンブリ バージョン
- アセンブリ ファイルのバージョン
「パッケージバージョン」はNuGetパッケージのバージョンのことである。NuGetは.NET Frameworkのパッケージマネージャである(ニューゲットやヌゲットなどと読むらしい)。ソフトウェアをNuGetで配布するなどしない限り、特に指定する必要はない。そのため、この記事ではこれ以降触れない。
「アセンブリバージョン」は、コンパイル後のコードのバージョンである。配布するexeやdllのバージョンがこれにあたる。
「アセンブリファイルのバージョン」は、コンパイルで生成されるexeやdllといったファイルが持つメタ情報である。
「アセンブリバージョン」と「アセンブリファイルのバージョン」の違いについては、以下のページも参考のこと。
AssemblyVersion と AssemblyFileVersion を使用する - Visual Studio Microsoft Docs
バージョンの形式
アセンブリとファイルのバージョンとも、4つの番号で構成されている。先頭から順に、
メジャー、マイナー、ビルド、リビジョン
と呼ばれる。各番号は0以上の整数である。
また、末尾から順に省略可能である。すなわち、
メジャー[、マイナー[、ビルド[、リビジョン]]]
となる(メジャー番号は省略不可)。番号を省略した場合は0扱いとなる。
各番号の違いは以下の通り(下記のリンクを個人的に解釈したものである)。また、当然のことながら、プロジェクトごとに異なる命名規則を設けてよいと思う。
- メジャー:下位互換性がなくなる場合にインクリメントする。
- マイナー:下位互換性を保ちつつ、大幅に機能を増やした場合にインクリメントする。
- ビルド:同じソースを再コンパイルした場合に番号を変更する(CPUやコンパイラ等が異なる場合)。
- リビジョン:セキュリティや誤字を修正した場合に変更する(バイナリに相互互換性がある)。
Version クラス (System) Microsoft Docs
ビルドとリビジョンについては、以下の自動採番の例をみるに、必ずしもインクリメントしなくて良いようである。
バージョン番号の自動採番
ビルド番号とリビジョン番号は*
とすることによって、自動的に採番される。
既定のビルド番号は、日ごとにインクリメントします。 既定のリビジョン番号は、(サマータイムによる調整を考慮せずに)現地時間の午前 0 時からの経過秒を 2 で割った値です。
AssemblyVersionAttribute クラス (System.Reflection) Microsoft Docs
ビルド番号は、2021/02/14に採番すると7715
だったため、2000/01/01を起点としているようである(2021/02/14の7715日前が2000/01/01である)。
また、*
を2つ指定することや、ビルド番号を*
としてリビジョン番号を固定値とすることはできない。
設定可能な例:
1.2.*
: リビジョン番号も自動採番される1.2.3.*
設定不可な例:
1.2.*.*
1.2.*.3
自動採番するためには、決定論的ビルドを無効にする必要がある。決定論的ビルドが有効な場合、同じソースコードからは常に同じバイナリが生成される。
無効にするためには、プロジェクトの設定ファイル (xxx.csproj) を開き、以下のように<Deterministic>false</Deterministic>
を追加する。もし同じ設定項目が既にある場合は、true
をfalse
に変更する。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
...
<Deterministic>false</Deterministic>
</PropertyGroup>
</Project>
ただし、決定論的ビルドを無効にすると、ビルドの度にバイナリが変更されてしまうことになる。CI/CD (Continuous Integration/Continuous Delivery) を行うような環境では、ビルドのキャッシュが効かなくなり、システムのCPU負荷が大きくなる場合があることに注意。
バージョンの設定方法
実際にC#ソフトウェアにバージョンを設定し、どのようにバージョン番号が表示されるか確認する。
ソリューションの作成
以下の手順でソリューションを作成する。
- Visual Studio Community 2019を起動する。
- 「新しいプロジェクトの作成」を選択。
- 「コンソール アプリ (.NET Core)」を選択。
- プロジェクトの構成で、「プロジェクト名」と「ソリューション名」をそれぞれ
ConsoleApp
とする。
バージョン設定画面
ソリューションエクスプローラ(デフォルトでは画面右側)の、ConsoleApp
を右クリックし、「プロパティ」を選択する。設定画面が開くので、左側の「パッケージ」をクリックする。すると、以下3つのバージョンの設定項目がある。
- パッケージ バージョン
- アセンブリ バージョン
- アセンブリ ファイルのバージョン
ここでは、アセンブリバージョンを1.2.3
と設定する(リビジョンの欄は空白とする)。
また、アセンブリファイルのバージョンを4.5.6.7
と設定する。
アセンブリバージョンを確認する
ソースコードからアセンブリバージョンを取得するため、Program.cs
を以下のように変更する。
|
|
次に、F5キーを押してデバッグを実行すると、ターミナルが立ち上がり、以下が表示される。
ConsoleApp 1.2.3.0
Name
はアセンブリ名、Version
はアセンブリバージョンである。省略したリビジョン番号が、0として設定されていることが分かる。
アセンブリファイルのバージョンを確認する
ソリューションがあるフォルダをエクスプローラで開き、
ConsoleApp\ConsoleApp\bin\Debug\netcoreapp3.1
にあるConsoleApp.exe
を右クリックし、「プロパティ」を開く。
「詳細」タブの「ファイルバージョン」の値は4.5.6.7
となっており、「アセンブリファイルのバージョン」になっていることが分かる。