383

Visual Studio (2005) を使用して、ファイルのビルド (およびバージョン) を自動的にインクリメントする方法を考えていました。

たとえばのプロパティを調べるとC:\Windows\notepad.exe、[バージョン] タブに「ファイル バージョン: 5.1.2600.2180」と表示されます。バージョン 1.0.0.0 ではなく、私の dll のバージョンでもこれらのクールな数値を取得したいと考えています。

いくつか試してみましたが、すぐに使用できる機能ではないようです。または、間違った場所を探しているだけかもしれません (いつものように)。

私は主にWebプロジェクトを扱っています....

私は両方を見ました:

  1. http://www.codeproject.com/KB/dotnet/Auto_Increment_Version.aspx
  2. http://www.codeproject.com/KB/dotnet/build_versioning.aspx

そして、何かをするのにそれほどの努力が標準的な慣習であるとは信じられませんでした。

編集: 私が知る限り、VS2005 では機能しません ( http://www.codeproject.com/KB/dotnet/AutoIncrementVersion.aspx )

4

25 に答える 25

448

Visual Studio 2008 では、次のように動作します。

AssemblyInfo.cs ファイルを見つけて、次の 2 行を見つけます。

[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

これを次のように変更してみてください。

[assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyFileVersion("1.0.*")]

しかし、これでは望ましい結果が得られず、製品バージョン1.0.*とファイル バージョン1.0.0.0になります。あなたが望むものではありません!

ただし、これらの行の 2 番目を削除して、次のようにすると:

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

次に、コンパイラはファイル バージョンを製品バージョンと等しくなるように設定し、同期している製品とファイル バージョンを自動的にインクリメントする目的の結果が得られます。例: 1.0.3266.92689

于 2008-12-10T16:35:54.593 に答える
157

AssemblyInfo.cs ファイルを開いて変更します

// You can specify all the values or you can default the Build and Revision Numbers 
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

[assembly: AssemblyVersion("1.0.*")]
//[assembly: AssemblyFileVersion("1.0.0.0")]

IDE でこれを行うには、[プロジェクト] -> [プロパティ] -> [アセンブリ情報] に移動します。

ただし、これにより、アセンブリのバージョンを自動インクリメントすることしかできず、

アセンブリ ファイルのバージョン: このフィールドではワイルドカード ("*") は使用できません

ファイル バージョン フィールドに * を入力しようとすると、メッセージ ボックスが表示されます。

したがって、assemblyinfo.cs を開いて手動で行うだけです。

于 2008-12-10T15:54:19.450 に答える
55

各ビルドでバージョン番号を変更する別のオプションは、 MSBuild.Community.TasksのVersionタスクを使用することです。インストーラーをダウンロードしてインストールし、次のコードを適用して、ファイルの後に貼り付けます。<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />.csproj

<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" />
<Target Name="BeforeBuild">
    <Version VersionFile="Properties\version.txt" Major="1" Minor="0" BuildType="Automatic" StartDate="12/31/2009" RevisionType="BuildIncrement">
      <Output TaskParameter="Major" PropertyName="Major" />
      <Output TaskParameter="Minor" PropertyName="Minor" />
      <Output TaskParameter="Build" PropertyName="Build" />
      <Output TaskParameter="Revision" PropertyName="Revision" />
    </Version>
    <AssemblyInfo CodeLanguage="CS"
                  OutputFile="Properties\VersionInfo.cs"
                  AssemblyVersion="$(Major).$(Minor)"
                  AssemblyFileVersion="$(Major).$(Minor).$(Build).$(Revision)" />
</Target>

注: StartDate プロパティをロケールに合わせてください。現在、インバリアント カルチャは使用されていません。

2010 年 1 月 14 日の 3 番目のビルドでは、次のVersionInfo.cs内容の が作成されます。

[assembly: AssemblyVersion("1.0")]
[assembly: AssemblyFileVersion("1.0.14.2")]

次に、このファイルをプロジェクトに追加する必要があり ( Add existing itemを使用)、AssemblyVersionAssemblyFileVersion行を から削除する必要がありますAssemblyInfo.cs

バージョン コンポーネントを変更するためのさまざまなアルゴリズムについては、$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.chmおよびバージョン プロパティで説明されています。

于 2010-01-15T09:21:09.373 に答える
30

Christians に似たソリューションを思いつきましたが、コミュニティの MSBuild タスクに依存せずに、すべての開発者にこれらのタスクをインストールしたくないので、これは選択肢ではありません。

コードを生成してアセンブリにコンパイルし、バージョン番号を自動インクリメントしたいと考えています。ただし、VS 6.0.* AssemblyVersion トリックは使用できません。ビルド番号が毎日自動インクリメントされ、古いビルド番号を使用するアセンブリとの互換性が失われるためです。代わりに、AssemblyVersion をハードコーディングし、AssemblyFileVersion を自動インクリメントしたいと考えています。AssemblyInfo.cs で AssemblyVersion を指定し、このように MSBuild で VersionInfo.cs を生成することで、これを実現しました。

  <PropertyGroup>
    <Year>$([System.DateTime]::Now.ToString("yy"))</Year>
    <Month>$([System.DateTime]::Now.ToString("MM"))</Month>
    <Date>$([System.DateTime]::Now.ToString("dd"))</Date>
    <Time>$([System.DateTime]::Now.ToString("HHmm"))</Time>
    <AssemblyFileVersionAttribute>[assembly:System.Reflection.AssemblyFileVersion("$(Year).$(Month).$(Date).$(Time)")]</AssemblyFileVersionAttribute>
  </PropertyGroup>
  <Target Name="BeforeBuild">
    <WriteLinesToFile File="Properties\VersionInfo.cs" Lines="$(AssemblyFileVersionAttribute)" Overwrite="true">
    </WriteLinesToFile>
  </Target>

これにより、AssemblyFileVersion の Assembly 属性を含む VersionInfo.cs ファイルが生成されます。バージョンは、ビルド日を含む YY.MM.DD.TTTT のスキーマに従います。このファイルをプロジェクトに含めて、ビルドする必要があります。

于 2011-06-24T18:28:27.360 に答える
17

BuildVersionIncrementアドインをインストールします。*オプションよりもはるかに詳細な制御が可能です。

于 2009-04-22T05:20:26.187 に答える
13

バージョン番号を取得するには、試してください

 System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
 System.Reflection.AssemblyName assemblyName = assembly.GetName();
 Version version = assemblyName.Version;

バージョン番号を設定するには、AssemblyInfo.cs を作成/編集します。

 [assembly: AssemblyVersion("1.0.*")]
 [assembly: AssemblyFileVersion("1.0.*")]

また、補足として、3 番目の数値は 2000 年 2 月 1 日からの日数であり、4 番目の数値は 1 日の合計秒数の半分です。したがって、真夜中にコンパイルすると、ゼロになるはずです。

于 2008-12-10T15:54:12.150 に答える
8

他の投稿で説明されているように、AssemblyInfo またはプロジェクト プロパティのバージョン番号に * を設定しても、Visual Studio / .NET のすべてのバージョンでは機能しません。

Afaik VS 2005 では機能しませんでした (ただし、VS 2003 および VS 2008 では)。VS 2005 の場合は、次を使用できます: Auto Increment Visual Studio 2005 version build and Revision number on compile time .

ただし、厳密な名前のアセンブリのバージョン番号を自動的に変更することはお勧めできません。その理由は、厳密な名前のアセンブリ参照は常に特定のアセンブリ バージョンへの参照であるため、参照先のアセンブリが再構築されるたびに、そのようなアセンブリへのすべての参照を更新する必要があるためです。インターフェイスに変更がある場合にのみ、Microsoft 自身が .NET Framework アセンブリのバージョン番号を変更します。(注: MSDN でリンク先を探しているところです。)

于 2008-12-10T15:56:24.703 に答える
6

増分(DateTime)情報をAssemblyFileVersionプロパティに取得します。これには、依存関係を壊さないという利点があります。


Boogのソリューション(おそらくVS2008のせいで、私には機能しませんでしたか?)に基づいて、ファイルを生成し、そのファイル(そのバージョンプロパティを含む)を追加し、次に読み取る方法を使用するビルド前イベントの組み合わせを使用できますそれらの値をもう一度。あれは..

ビルド前イベント:

echo [assembly:System.Reflection.AssemblyFileVersion("%date:~-4,4%.%date:~-7,2%%date:~-10,2%.%time:~0,2%%time:~3,2%.%time:~-5,2%")] > $(ProjectDir)Properties\VersionInfo.cs

結果のVersionInfo.csファイル(プロパティサブフォルダー)をプロジェクトに含めます

日付を取り戻すためのコード(年から秒まで):

var version = assembly.GetName().Version;
var fileVersionString = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location).FileVersion;
Version fileVersion = new Version(fileVersionString);
var buildDateTime = new DateTime(fileVersion.Major, fileVersion.Minor/100, fileVersion.Minor%100, fileVersion.Build/100, fileVersion.Build%100, fileVersion.Revision);

あまり快適ではありません..また、それが多くの強制的な再構築を作成するかどうかはわかりません(ファイルは常に変更されるため)。

たとえば、VersionInfo.csファイルを数分/時間ごとに更新するだけの場合(一時ファイルを使用し、十分に大きな変更が検出された場合は実際のVersionInfo.csをコピー/上書きすることにより)、よりスマートにすることができます。私はこれを一度かなりうまくやった。

于 2012-07-10T18:37:31.577 に答える
5

バージョン番号を「1.0.*」に設定すると、最後の 2 つの数字に日付 (ある時点からの日数) と時刻 (午前 0 時からの 0.5 秒) が自動的に入力されます。

于 2008-12-10T15:54:35.627 に答える
5

これは、 [発行] の下のプロジェクト プロパティにあります。

http://screencast.com/t/Vj7rhqJO
(~ http://screencast.com/t/Vj7rhqJO )

于 2008-12-10T15:55:03.880 に答える
4

バージョンの入手方法{major}.{year}.1{date}.1{time}

これは一種の実験的なものですが、私はそれが好きです。Jeff Atwood @ CodingHorror (リンク) に触発されました。

結果のバージョン番号は1.2016.10709.11641(2016-07-09 16:41 を意味する) になり、

  • 貧乏人のゼロパディング(愚かな先頭1の s 付き)
  • バージョン番号に埋め込まれたほぼ人間が読めるローカルDateTime
  • 本当に主要な破壊的変更のためにメジャーバージョンをそのままにしておきます。

プロジェクトに新しい項目を追加し、[一般] -> [テキスト テンプレート] を選択し、次のような名前を付けて(該当する場合) とをCustomVersionNumberコメント アウトAssemblyVersionします。AssemblyFileVersionProperties/AssemblyInfo.cs

次に、このファイルを保存するか、プロジェクトをビルドすると.cs、作成されたファイルの下のサブアイテムとしてファイルが再生成され.ttます。

<#@ template language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>

//
// This code was generated by a tool. Any changes made manually will be lost
// the next time this code is regenerated.
//

using System.Reflection;

<#
    var date = DateTime.Now;
    int major = 1;
    int minor = date.Year;
    int build = 10000 + int.Parse(date.ToString("MMdd"));
    int revision = 10000 + int.Parse(date.ToString("HHmm"));
#>

[assembly: AssemblyVersion("<#= $"{major}.{minor}.{build}.{revision}" #>")]
[assembly: AssemblyFileVersion("<#= $"{major}.{minor}.{build}.{revision}" #>")]
于 2016-07-09T13:53:47.653 に答える
3

プロジェクトに移動 | [プロパティ]、[アセンブリ情報]、[アセンブリ バージョン] の順にクリックし、最後または最後から 2 番目のボックスに * を入力します (メジャー コンポーネントまたはマイナー コンポーネントを自動インクリメントすることはできません)。

于 2008-12-10T15:54:09.963 に答える
2

MSBuild コミュニティ タスク ( http://msbuildtasks.tigris.org/ ) プロジェクトの AssemblyInfo タスクを使用し、.csproj/.vbproj ファイルに統合します。

バージョン番号を日付と時刻に関連付けるオプションなど、いくつかのオプションがあります。

おすすめされた。

于 2008-12-15T05:20:35.877 に答える
2

今のところ、私のアプリケーションについては、

string ver = Application.ProductVersion;

戻り値ver = 1.0.3251.27860

値 3251 は、2000 年 1 月 1 日からの日数です。これを使用して、アプリケーションのスプラッシュ スクリーンにバージョンの作成日を表示します。ユーザーとやり取りするときは、長い数字よりも作成日の方が伝えやすいと思います。

(私は小さな会社をサポートする 1 人の部署です。このアプローチはあなたには合わないかもしれません。)

于 2008-12-11T20:26:07.730 に答える
2

ファイルのバージョンを自動的にインクリメントするアプリケーションを作成しました。

  1. アプリケーションをダウンロード
  2. 次の行をビルド前のイベント コマンド ラインに追加します。

    C:\temp\IncrementFileVersion.exe $(SolutionDir)\Properties\AssemblyInfo.cs

  3. プロジェクトをビルドする

簡単にするために、アプリはエラーが発生した場合にのみメッセージをスローします。正常に機能したことを確認するには、「アセンブリ情報」でファイルのバージョンを確認する必要があります

注 : [アセンブリ情報] ボタンを使用して Visual Studio でソリューションを再読み込みしてフィールドに入力する必要がありますが、出力ファイルには更新されたバージョンが含まれます。

提案やリクエストについては、telson_alva@yahoo.com までメールでお問い合わせください。

于 2017-06-23T11:16:44.593 に答える
2

AssemblyInfo の変更は VS2012 で機能します。Visual Studio でこれがサポートされていないのは奇妙に思えますが、これはビルド/リリース プロセスの基本的な部分であると思われるでしょう。

于 2014-01-24T06:01:49.440 に答える
1

AssemblyInfoUtil。無料。オープンソース。

于 2014-05-08T06:30:01.387 に答える
1

私はこのアプローチを使用してい ます https://stackoverflow.com/a/827209/3975786 T4テンプレートを「ソリューションアイテム」に配置し、各プロジェクト内で「リンクとして追加」で使用します。

于 2015-04-23T11:07:45.383 に答える
0

ビルドを行うたびに、最下位桁が自動インクリメントされます。

他のものを更新する方法はわかりませんが、少なくとも既に表示されているはずです...

于 2008-12-10T15:54:06.563 に答える