6

C# 3.0 では、クラスのバージョンを含むと思われるプロパティがあります。バージョン番号は、単にコンパイルの日付と時刻です。現在、次のコードがあります。

public DateTime Version
{
    get { return DateTime.UtcNow; }
}

このプロパティは現在の日付と時刻を返すため、これは明らかに間違っています。では、プリコンパイラはコンパイル時に DateTime を出力できますか? この場合、以下のようなことができます。

public DateTime Version
{
    get { return new DateTime("PRECOMPILER DATE"); }
}
4

7 に答える 7

8

dll自体から取得できます(出典:codinghorror

   private DateTime RetrieveLinkerTimestamp() {
        string filePath = System.Reflection.Assembly.GetCallingAssembly().Location;
        const int c_PeHeaderOffset = 60;
        const int c_LinkerTimestampOffset = 8;
        byte[] b = new byte[2048];
        System.IO.Stream s = null;

        try {
            s = new System.IO.FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read);
            s.Read(b, 0, 2048);
        } finally {
            if (s != null) {
                s.Close();
            }
        }

        int i = System.BitConverter.ToInt32(b, c_PeHeaderOffset);
        int secondsSince1970 = System.BitConverter.ToInt32(b, i + c_LinkerTimestampOffset);
        DateTime dt = new DateTime(1970, 1, 1, 0, 0, 0);
        dt = dt.AddSeconds(secondsSince1970);
        dt = dt.AddHours(TimeZone.CurrentTimeZone.GetUtcOffset(dt).Hours);
        return dt;
    }
于 2009-01-07T08:31:45.790 に答える
7

C# にはマクロの概念がありません。ただし、ビルド スクリプトで他のツール (csproj / NANT / など) を使用して、コンパイル前にソースを操作できます。たとえば、これを使用して、リビジョン番号を現在の SVN リビジョンに設定します。

安価なオプションは、ビルド前のイベントです (VS のプロジェクト プロパティ ダイアログでこれを行うことができます)。基本的には、ビルド前に実行されるバッチ ファイルです。その後、必要な変更をスクリプト化できます。より高度なオプションは、ビルド タスクです。

たとえば、ここTimeのユーティリティ ライブラリにはタスクとタスクが含まれていFileUpdateます。必要なものをエミュレートするために、(理論的には) 2 つを連鎖させることができるはずです。

個人的には[AssemblyVersion]、時間よりも詳細を使用します。これをソース管理システムにリンクすると、問題のあるバージョンを簡単に見つけることができます。私のSVNバージョンでは、(ビルドプロジェクトで)次を使用します。

<!-- See http://msbuildtasks.tigris.org -->
<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>
...
<SvnInfo LocalPath=".">
  <Output TaskParameter="Revision" PropertyName="BuildRev" />
</SvnInfo>
...
<FileUpdate Files="Path\To\My\AssemblyInfo.cs"
    Regex='(\[\s*assembly:\s*AssemblyVersion\(\s*"[^\.]+\.[^\.]+)\.([^\.]+)(\.)([^\.]+)("\)\s*\])'
    ReplacementText='$1.$2.$(BuildRev)$5' />
<FileUpdate Files="Path\To\My\AssemblyInfo.cs"
    Regex='(\[\s*assembly:\s*AssemblyFileVersion\(\s*"[^\.]+\.[^\.]+)\.([^\.]+)(\.)([^\.]+)("\)\s*\])'
    ReplacementText='$1.$2.$(BuildRev)$5' />

これで、OS によって報告されるファイル バージョンを含め、アセンブリ バージョンが正しくなりました。

于 2009-01-07T07:53:54.227 に答える
3

C#のプリプロセッサ ディレクティブに相当するものはありません__TIME__。最善の方法は、現在のアセンブリを取得して作成日を取得することです。これにはコンパイル時間が含まれます。こちらをご覧ください

于 2009-01-07T07:58:45.153 に答える
0

プリプロセッサ__TIME__ディレクティブはありませんが、アセンブリの作成時間など、他にも使用できるものがあります。ソース管理システム (subversion では $Date$) からのキーワード置換の使用を検討することもできます。

于 2009-01-07T08:13:13.190 に答える
0

C# でこれを行う方法はないと思います - C++ スタイルのマクロ定義は明示的に禁止されています。

アセンブリの最終変更日を使用して回避するか、テキスト ファイルを埋め込みリソースとして含めて、現在の日付/時刻を書き込むカスタム ビルド アクションを追加する可能性があります。

于 2009-01-07T08:02:23.087 に答える
-1

ビルド番号はアセンブリのメタデータから取得でき、ビルドの日付と一致するように設定できます。

通常は、AssemblyInfo.cs ファイルでエントリを検索または作成します。Visual Studio を使用してプロジェクトを作成する場合。例:

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

AssemblyVersionAttributeに関するドキュメントの引用。(重要な部分を太字にしてあります)

アスタリスク ( ) を使用して、すべての値を指定するか、デフォルトのビルド番号、リビジョン番号、またはその両方を受け入れることができます。たとえば、[assembly:AssemblyVersion("2.3.25.1")] は、メジャー バージョンとして 2、マイナー バージョンとして 3、ビルド番号として 25、リビジョン番号として 1 を示します。 [assembly:AssemblyVersion("1.2. ")] などのバージョン番号は、メジャー バージョンとして 1、マイナー バージョンとして 2 を指定し、デフォルトのビルド番号とリビジョン番号を受け入れます。[assembly:AssemblyVersion("1.2.15.*")] などのバージョン番号は、メジャー バージョンとして 1、マイナー バージョンとして 2、ビルド番号として 15 を指定し、デフォルトのリビジョン番号を受け入れます。デフォルトのビルド番号は毎日増加します。デフォルトのリビジョン番号はランダムです。

ご覧のとおり、これでデフォルトのビルド番号を設定できれば。デフォルトのビルド番号は、毎日増加する値です。

次に、 AssemblyName.Versionプロパティを使用してビルド番号を取得できます。MSDN が提供する例を参考にしてください。

デフォルトのビルド番号は、2000 年 1 月 1 日からの日数です。

この質問には、これの使用方法に関する明確な説明もあります。

于 2009-01-07T08:47:56.660 に答える
-1

次のようなものを探していますか:
(バージョン情報を介してアセンブリをビルドした日付を取得します。ビルド番号は 1.1.2000 からの日数です)

         var version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
        DateTime versionsDatum = new DateTime(2000, 1, 1);
        versionsDatum = versionsDatum.AddDays(version.Build);
于 2009-08-28T08:17:33.250 に答える