Skip to content

MS_DotNetAssemblyVersion

nishi_74322014 edited this page Aug 21, 2026 · 1 revision

.NETアセンブリのバージョン情報

概要

.NET Standard.NET Core での
設定方法を調査しがてら作成してみた。

詳細

AssemblyVersion(.NET Standard.NET Core では Version
を指定して、NuGet パッケージ(NuGetパッケージの開発と公開)の
バージョンと一致させておけばよさそう。

補足(結論から言うと): 現在の SDK 形式プロジェクトでは、
<Version> を 1 つ書けば他はすべて追随する
以下の 3 種・4 種の使い分けは、
意図的に別々の値にしたい場合にだけ必要になる。

<PropertyGroup>
  <Version>1.2.3</Version>   <!-- これだけで足りることが多い -->
</PropertyGroup>

バージョン番号の付け方(.NET)

major.minor.build.revision の形式で付与する。

メジャー バージョン番号(major)

変更の意味

  • 新バージョンが以前のバージョンと大きく異なる。
  • 後方互換性が失われている可能性が高い。

マイナー バージョン番号(minor)

変更の意味

  • かなりの変更がなされたが、
    可能なかぎり後方互換性が保たれている。

  • 後方互換性

    • 以前のバージョンに無かった機能を含めることができる。
    • しかし、旧い機能は改訂によって影響を受けてはいけない。

ビルド番号(build)

変更の意味

  • リビジョンがバグ修正のための必須のアップグレードであり、
    必ずインストールすべきことを意味する。
  • クイック フィックス エンジニアリング (QFE) のバグ修正版は
    前のバージョンと互換性を保つ必要がある。

リビジョン番号(revision)

変更の意味

変更は、小さな変更のみがなされ、新バージョンは、
依然として後方互換性を保っていることを意味する。

※ NuGet のバージョン番号(NuGetパッケージの開発と公開)には存在しない。

補足(.NET 方式とセマンティック バージョニングの対応): .NET の
4 桁方式と、NuGet が採る **SemVer(3 桁 + プレリリース)**は
桁数が違うため、対応関係を押さえておく必要がある。

【.NET】  major . minor . build . revision
【SemVer】MAJOR . MINOR . PATCH [-プレリリース]
          例: 1.2.3-beta.1
.NET の 4 桁 SemVer
互換性を壊す major MAJOR
機能追加(互換あり) minor MINOR
バグ修正 build PATCH
微修正 revision 無し(プレリリース タグで表現)

原文の「NuGet のバージョン番号には revision が存在しない」は
SemVer が 3 桁だからである。
したがって、NuGet パッケージを出すライブラリでは
<Version> を SemVer(3 桁)で書くのが素直で、
AssemblyVersion 側は 4 桁目が 0 で補われる。

なお、AssemblyVersion は不用意に上げないのが定石である
(後述のとおり、これが変わると参照側の再ビルドや
バインディング リダイレクトが必要になるため)。
実務では次のようにすることが多い。

<Version>1.2.3</Version>              <!-- NuGet / 表示用 -->
<AssemblyVersion>1.0.0.0</AssemblyVersion>  <!-- メジャー内で固定 -->

.NET Framework

AssemblyVersion

  • アセンブリのバージョン。

  • CLR が使用する。

    • GAC(グローバル・アセンブリ・キャッシュ)
    • アセンブリ バージョンのリダイレクト
  • 使用方法

    • major.minor.build.revision の形式
    • build と revision にはワイルドカード(*)を
      指定すると、コンパイラに自動的に値を決定する。
    • AssemblyVersion のみを設定した場合、
      他の 2 つのバージョンも同じ値になる。

AssemblyFileVersion

  • ファイルのバージョン

  • 以下で使用される。

    • Win32 EXE/DLL としてのバージョン。
    • プロパティ・ダイアログで表示されるファイルバージョン
  • 使用方法

    • major.minor.build.revision の形式
    • AssemblyFileVersion のみ設定した場合、
      他の 2 つのバージョンも同じ値になる。

AssemblyInformationalVersion

  • ユーザー向けに表示される追加的なバージョン情報(製品バージョン)

  • 使用方法

    • major.minor.build.revision 以外の形式
    • 他にも任意の文字列を指定できる。
    • AssemblyInformationalVersion のみ設定した場合、
      他の 2 つのバージョンは 0.0.0.0 になる。

補足(3 つの使い分けが重要な理由): 見た目が似ているが、
誰が見るかがまったく違う。

誰が使うか 変えると何が起きるか
AssemblyVersion CLR(実行時のバインド) 参照側が壊れる。再ビルドかリダイレクトが要る
AssemblyFileVersion 人・OS(エクスプローラーのプロパティ) 何も壊れない(表示が変わるだけ)
AssemblyInformationalVersion 人(製品バージョン表示) 何も壊れない。文字列可(1.2.3-beta+sha
AssemblyVersion   1.0.0.0   ← 固定しておく(互換のある範囲では変えない)
FileVersion       1.2.3.456 ← ビルドごとに上げてよい
InformationalVer  1.2.3-beta.1+abc1234  ← Git のコミット ハッシュ等を含めても可

ビルドのたびに AssemblyVersion を上げる設定にすると、
参照している全アセンブリの再ビルドが必要になり、
NuGetMSB3247(バージョン競合)を招く。
ワイルドカード 1.0.* は、まさにこれをやってしまうため、
ライブラリでは避けるべきである。

.NET Standard.NET Core では、
*.csproj に移動になっている模様。

Version

すべてのバージョン番号の既定値になる値。

AssemblyVersion

FileVersion

PackageVersion

  • NuGet パッケージの生成に使用される。
  • 既定値は、Version に一致する。

補足(AssemblyInfo.cs が消えた): SDK 形式のプロジェクトでは、
AssemblyInfo.cs が自動生成されるようになった。
このため、旧形式から移行した際に
**「同じ属性が二重定義されている」というエラー(CS0579)**が出ることがある。

<!-- 旧 AssemblyInfo.cs を残したい場合 -->
<PropertyGroup>
  <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>

通常は AssemblyInfo.cs を削除して .csproj に集約するのが正しい。

補足(CI でバージョンを注入する): 実務では、
ソースにバージョンを書かず、ビルド時に渡すことが多い。

dotnet build -c Release -p:Version=1.2.3 -p:InformationalVersion=1.2.3+$GIT_SHA

MinVerNerdbank.GitVersioning といったツールを使うと、
Git のタグ / コミット数から自動的にバージョンを決定できる。

参考

NuGet 関連

.NET Framework

.NET Standard.NET Core - Stack Overflow


Tags: 移行, .NET開発

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally