显示构建日期

2024-03-15

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

计划是将构建日期放在那里 - 例如“应用程序构建于 21/10/2009”。

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

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

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

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

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

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


杰夫·阿特伍德 (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 范围内的随机年份。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

显示构建日期 的相关文章

随机推荐

  • 是否可以在没有重定向服务器的情况下使用 OAuth 2.0?

    我正在尝试创建一个与 SurveyMonkey API 交互的基于 Java 的本地客户端 SurveyMonkey 需要使用 OAuth 2 0 的长期访问令牌 我对此不太熟悉 我已经在谷歌上搜索了几个小时 我认为答案是否定的 但我只是想
  • 如何在 Notepad++ 中使用富文本?

    我喜欢Notepad 但有时我需要将一些单词设置为粗体或草书 更改字体大小等 在 Notepad 中可以吗 我们可以突出显示文本 右键单击文本Style Token gt Using 1st Style通过使用这个我们可以突出显示文本 最多
  • .NET ImageList 实现中的 ImageList 容量错误?

    我在 net 应用程序中为 ListView 使用 ImageList 时遇到一些问题 在我的实现中 这个 ImageList 根据使用情况可以容纳几千个图像 这个问题最初是在我尝试处理大量图像时出现的 当我超过 5K 图像时 我在尝试添加
  • 使用 espresso 在网页视图中查找多个元素

    我正在测试一个混合应用程序 其中每个视图都有一个网络视图 在其中一个 Web 视图中 我有一个具有相同属性的元素列表 它们具有相同的 xpath 定位器 如下所示 h4 contains data role product name 我想创
  • 如何使用 vba 正确地重新格式化具有多种变化的尺寸值?

    我正在尝试创建一个 Excel 宏 将维度值格式化为我们公司的格式 这样我们就可以轻松地将数据导入到我们的系统中 而无需手动执行数千个维度 我遇到了一些问题 供应商向我们发送的维度有很多变化 这使得我很难想出某种正则表达式来捕获所有值 即使
  • 如何确认 Twitter Web 意图已发送?

    我想确认用户在点击后发布的推文Twitter 网络意图 https dev twitter com docs intents 我怎样才能做到这一点 Example a href https twitter com intent tweet
  • Pandas——根据另一个表中的值设置行值

    我在 pandas 中有两张桌子 其中大约有 10 000 多行 如下所示 Table 1 col 1 date state ratio 50 more cols A 10 12 NY 5 A 12 05 MA NaN 我有另一个大约 10
  • 在生产构建 Angular 4 中访问环境变量

    我想部署一个带有可配置 api url 的 Angular 应用程序的生产版本 供用户测试 我使用environment ts 但在生产构建之后 我不知道如何配置变量 需要采取什么方法 environment ts 文件包含构建时配置 构建
  • robots.txt htaccess 阻止谷歌

    在我的 htaccess 文件中 我有
  • 当我尝试通过 js split 解析时,第一个元素是空字符串

    我尝试解析ini文件 第一个字符串是空字符串 但其他字符串还可以 结构 sensor1 param1 value sensor2 param1 value param2 value 我的代码是 success function data v
  • 如果我使用支持库 26,为什么选项菜单项会被挤压? [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 选项菜单项的大小与支持库 25 的大小相同 但当我使用 26 0 0 时 它们都会被挤压 菜单项 XML menu me
  • 用我自己的值初始化pytorch卷积层

    我想知道是否有办法用我自己的值初始化 pytorch 卷积过滤器 例如 我有一个元组 0 8423 0 3778 3 1070 2 6518 我想用这些值初始化 2X2 过滤器 我该怎么做 我查找了一些答案 但他们大多使用火炬正态分布和其他
  • Puppeteer 等待所有图像加载然后截图

    我在用傀儡师 https github com GoogleChrome puppeteer尝试在所有图像加载后截取网站的屏幕截图 但无法使其正常工作 这是到目前为止我正在使用的代码https www digg com https www
  • 使用position_dodge绘制geom_segment

    我有一个数据集 其中包含个人随时间的工作地点信息 更具体地说 我有关于个人在特定工作场所工作的时间间隔的信息 library tidyverse library lubridate individual A a id lt c rep A
  • 为什么我的 venv 使用的 pip 版本与我安装的不同

    我正在设置虚拟环境 我收到有关过时 pip 19 2 的警告 因此我在全球范围内更新了我的 macos 系统上的 pip sudo H python3 m pip install upgrade pip 它似乎有效 但是当我制作新的 ven
  • 如何使用 CSS/Javascript 根据窗口高度使 div 在两个 div 之间自动调整其高度?

    我有一个 div 位于正文顶部 另一个 div 位于正文底部 现在我想在这两个 div 之间放置一个 div 并使其高度占据这两个 div 之间的最大可用空间 这两个 div 之间的垂直空间不是固定的 这意味着当用户减小 增加窗口的高度时
  • Android Studio 观察表达式持久性

    每次调试后 Android Studio 都会删除我的所有监视表达式 我怎样才能强制它保留我的手表并将它们保存在项目中 据我所知 没有办法保存手表 但是 您可以使用 自动变量模式 左下角调试器选项卡 gt gt 设置按钮 这将清理调试器变量
  • 在 keyDown 事件中获取修饰符Flags,而无需同时按下非修饰键!

    我在 NSDocument 应用程序中对 NSWindow 进行了子类化 以便接收 keyDown 事件 我在我的子类中使用了以下代码 void keyDown NSEvent theEvent NSLog keyDown if theEv
  • 如何在 ILNumerics 中配置刻度标签位置?

    I draw some lines with ILLinePlot 然后我旋转立方体 目的是更改从顶部开始的 Y 刻度标签的位置 Rotation Matrix4 Rotation new Vector3 1 0 0 ILMath pif
  • 显示构建日期

    我目前有一个应用程序在其标题窗口中显示内部版本号 这很好 但对大多数用户来说没有任何意义 他们想知道他们是否拥有最新版本 他们倾向于将其称为 上周四的 而不是版本 1 0 8 4321 计划是将构建日期放在那里 例如 应用程序构建于 21