4

プレビルドイベント中に実行されるビルド インクリメンター プログラムを更新しているときに、かなりの問題を引き起こす可能性がある潜在的な問題に気付きました。初めてアプリケーションをビルドするBuildInfo.csと、すべての const 値が正常に更新および計算されます。後続の各ビルドとビルド前イベントの正常な実行により、適切なファイルが更新されますが (以下に示すように)、計算された各 const 値は最後のビルドから古くなっています。

// In externally modified file BuildInfo.cs which is updated by our pre-build
// tool to update the version information and produce new consts.
namespace ConstProblem.Properties {
  static class BuildInfo {
    internal const string AssemblyVersionString = "1.1.0.0";
    internal const string BuildDate = "2012-11-07T08:52:32.5480259-07:00";
    internal const string FileVersionString = "1.1.12312.852";
    internal const string Full = "v1.1 (Build: 2012-11-07 08:52)";
    internal const string Short = "1.1";
  }
}

// Program.cs. Reproduces the problem for this question.
namespace ConstProblem {
  class Program {
    const string UserAgent = "ConstProblem/" + Properties.BuildInfo.Short;

    static void Main() {
      System.Console.WriteLine(UserAgent);
    }
  }
}

例として、アプリケーションはもともとAssemblyVersionStringat でビルドされました1.0.0.0。上記のプログラムは、期待どおりに実行およびコンパイルされました。これを 1.1 に増やし、アプリケーションをもう一度ビルド/実行すると、ConstProblem/1.0出力として生成され、これが値になります。

// From the Immediate Window
Properties.BuildInfo
ConstProblem.Properties.BuildInfo
    base {object}: object
    AssemblyVersionString: "1.1.0.0"
    BuildDate: "2012-11-07T08:51:46.8404556-07:00"
    FileVersionString: "1.0.12312.851"
    Full: "v1.0 (Build: 2012-11-07 08:51)"
    Short: "1.0"

ご覧のとおり、は適切AssemblyVersionStringに更新されまし1.1.0.0たが、残りの計算値は更新されていません。3 回目のビルドと実行 (さらに 1.2 に増やす) を行うと、上記の情報に更新されます。

ビルド前イベントによる出力ファイルは、すべての情報が正しく出力され、ステータス 0 で終了してビルドを続行できることを確認しました。constが常に1ビルド遅れている理由について、私は途方に暮れています。ビルド ユーティリティも私が作成したもので、テンプレートを使用するだけで、ファイルがチェックアウトされている場合は BuildInfo.cs の内容を置き換えます。

私の環境では、Visual Studio 2010 Ultimate を実行し、.Net 4 でコンパイルしています。コンソール アプリケーションと Web アプリケーションの両方でこれを再現しました。独自のアセンブリのアセンブリ バージョンとファイル バージョンを取得する方法のコメントから、const 値を使用するというアイデアを得ました。

4

1 に答える 1