JavaScriptを有効にしてください

C#ソフトウェアのバージョンを設定する

 ·  ☕ 5 min read  ·  ✍️ Helve

はじめに

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>を追加する。もし同じ設定項目が既にある場合は、truefalseに変更する。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    ...
    <Deterministic>false</Deterministic>
  </PropertyGroup>

</Project>

ただし、決定論的ビルドを無効にすると、ビルドの度にバイナリが変更されてしまうことになる。CI/CD (Continuous Integration/Continuous Delivery) を行うような環境では、ビルドのキャッシュが効かなくなり、システムのCPU負荷が大きくなる場合があることに注意。

バージョンの設定方法

実際にC#ソフトウェアにバージョンを設定し、どのようにバージョン番号が表示されるか確認する。

ソリューションの作成

以下の手順でソリューションを作成する。

  1. Visual Studio Community 2019を起動する。
  2. 「新しいプロジェクトの作成」を選択。
  3. 「コンソール アプリ (.NET Core)」を選択。
  4. プロジェクトの構成で、「プロジェクト名」と「ソリューション名」をそれぞれConsoleAppとする。

バージョン設定画面

ソリューションエクスプローラ(デフォルトでは画面右側)の、ConsoleAppを右クリックし、「プロパティ」を選択する。設定画面が開くので、左側の「パッケージ」をクリックする。すると、以下3つのバージョンの設定項目がある。

  • パッケージ バージョン
  • アセンブリ バージョン
  • アセンブリ ファイルのバージョン

ここでは、アセンブリバージョンを1.2.3と設定する(リビジョンの欄は空白とする)。
また、アセンブリファイルのバージョンを4.5.6.7と設定する。

プロジェクトの設定画面

アセンブリバージョンを確認する

ソースコードからアセンブリバージョンを取得するため、Program.csを以下のように変更する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
using System;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            var assm = System.Reflection.Assembly.GetExecutingAssembly();
            var name = assm.GetName();
            Console.WriteLine("{0} {1}", name.Name, name.Version);
        }
    }
}

次に、F5キーを押してデバッグを実行すると、ターミナルが立ち上がり、以下が表示される。

ConsoleApp 1.2.3.0

Nameはアセンブリ名、Versionはアセンブリバージョンである。省略したリビジョン番号が、0として設定されていることが分かる。

アセンブリファイルのバージョンを確認する

ソリューションがあるフォルダをエクスプローラで開き、
ConsoleApp\ConsoleApp\bin\Debug\netcoreapp3.1
にあるConsoleApp.exeを右クリックし、「プロパティ」を開く。
「詳細」タブの「ファイルバージョン」の値は4.5.6.7となっており、「アセンブリファイルのバージョン」になっていることが分かる。

参考

シェアする
ブログランキングに参加中です。クリックして頂けると励みになります。

Helve
WRITTEN BY
Helve
関西在住、電機メーカ勤務のエンジニア。Twitterで新着記事を配信中です