diff --git a/SabreTools.Helper/Data/Build.cs b/SabreTools.Helper/Data/Build.cs index 878c022d..3ddf266a 100644 --- a/SabreTools.Helper/Data/Build.cs +++ b/SabreTools.Helper/Data/Build.cs @@ -40,7 +40,7 @@ namespace SabreTools.Helper.Data Console.BackgroundColor = ConsoleColor.Blue; } - Console.Title = "SabreTools-" + name + " " + Constants.Version; + Console.Title = name + " " + Constants.Version; // Output the header Console.WriteLine(border); diff --git a/SabreTools.Helper/Data/Constants.cs b/SabreTools.Helper/Data/Constants.cs index 650f3846..50ae9e26 100644 --- a/SabreTools.Helper/Data/Constants.cs +++ b/SabreTools.Helper/Data/Constants.cs @@ -1,4 +1,7 @@ using System; +using System.Reflection; + +using SabreTools.Helper.Tools; namespace SabreTools.Helper.Data { @@ -7,7 +10,7 @@ namespace SabreTools.Helper.Data /// /// The current toolset version to be used by all child applications /// - public const string Version = "v0.9.3"; + public static string Version = "v0.9.3-" + Assembly.GetExecutingAssembly().GetLinkerTime().ToString("yyyy-MM-dd HH:mm:ss"); public const int HeaderHeight = 3; #region 0-byte file constants diff --git a/SabreTools.Helper/Tools/Style.cs b/SabreTools.Helper/Tools/Style.cs index 66812eba..be1e4a77 100644 --- a/SabreTools.Helper/Tools/Style.cs +++ b/SabreTools.Helper/Tools/Style.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Reflection; using System.Text; using System.Text.RegularExpressions; using System.Web; @@ -575,6 +576,32 @@ namespace SabreTools.Helper.Tools return Encoding.Default; } + /// + /// http://stackoverflow.com/questions/1600962/displaying-the-build-date + /// + 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; + } + #endregion } }