杰夫·阿特伍德 (Jeff Atwood) 关于这个问题有几点要说:艰难地确定构建日期 http://blog.codinghorror.com/determining-build-date-the-hard-way/.
最可靠的方法是从链接器时间戳中检索PE标头 https://web.archive.org/web/20120106051754/http://support.microsoft.com/kb/65122嵌入到可执行文件中——一些 C# 代码(由 Joe Spivey 编写)来自 Jeff 文章的评论:
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();
注意:此方法适用于.NET Core 1.0,但是.NET Core 1.1 之后停止工作- 它给出 1900-2020 范围内的随机年份。