gpt4 book ai didi

c# - 显示构建日期

转载 作者:IT王子 更新时间:2023-10-29 03:28:56 25 4
gpt4 key购买 nike

我目前有一个应用程序在其标题窗口中显示内部版本号。这很好,但对大多数用户来说没有任何意义,他们想知道他们是否拥有最新版本 - 他们倾向于将其称为“上周四的”而不是版本 1.0.8.4321。

计划是将构建日期放在那里 - 例如“App build on 21/10/2009”。

我正在努力寻找一种编程方式来将构建日期作为文本字符串提取出来,以便像这样使用。

对于内部版本号,我使用了:

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

在定义了这些是如何产生之后。

我想要类似的编译日期(和时间,以获得奖励积分)。

非常感谢这里的指针(如果合适请原谅双关语),或更简洁的解决方案...

最佳答案

Jeff Atwood 在 Determining Build Date the hard way 中就此问题发表了一些看法.

事实证明,最可靠的方法是从 PE header 中检索链接器时间戳。嵌入到可执行文件中——一些 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 范围内的随机年份。

关于c# - 显示构建日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1600962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com