1. ホーム
  2. c#

[解決済み】ビルドデータの表示について

2022-04-14 08:16:33

質問

現在、タイトルウィンドウにビルド番号を表示するアプリを使用しています。 最新のビルドがあるかどうかを知りたいほとんどのユーザーにとっては何の意味もありませんが、彼らはビルド 1.0.8.4321 ではなく、quot;先週の木曜日; と呼ぶ傾向があります。

例えば、"App built on 21/10/2009" のように、ビルドの日付を代わりに記載する予定です。

このような使い方をするために、プログラム的にビルドデータをテキスト文字列として取り出す方法を見つけるのに苦労しています。

ビルド番号は、私が使用した

Assembly.GetExecutingAssembly().GetName().Version.ToString()

が出てきた経緯を定義した後。

コンパイル日(ボーナスポイントとして時間も)のようなものが欲しいです。

また、より良い解決策もお待ちしています。

解決方法は?

ジェフ・アトウッドは、この問題について、次のようなことを述べています。 ビルドデータの決定が難しい .

最も信頼性の高い方法は、リンカのタイムスタンプを PEヘッダー Jeffの記事へのコメントから、Joe SpiveyによるC#のコードをいくつか引用しています。

public static DateTime GetLinkerTime(this Assembly assembly, TimeZoneInfo target = null)
{
    var filePath = assembly.Location;
    const int c_PeHeaderOffset = 60;
    const int c_LinkerTimestampOffset = 8;

    var buffer = new byte[2048];

    using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
        stream.Read(buffer, 0, 2048);

    var offset = BitConverter.ToInt32(buffer, c_PeHeaderOffset);
    var secondsSince1970 = BitConverter.ToInt32(buffer, offset + c_LinkerTimestampOffset);
    var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

    var linkTimeUtc = epoch.AddSeconds(secondsSince1970);

    var tz = target ?? TimeZoneInfo.Local;
    var localTime = TimeZoneInfo.ConvertTimeFromUtc(linkTimeUtc, tz);

    return localTime;
}

使用例です。

var linkTimeLocal = Assembly.GetExecutingAssembly().GetLinkerTime();

UPDATE: この方法は、.Net Core 1.0 では動作していましたが .Net Core 1.1以降、動作しなくなった リリース(1900-2020の範囲でランダムな年号を与える)