c# - 如何使用发布日期作为 .net 项目的程序集版本?

标签 c# .net

我知道汇编版的格式是:

<major version>.<minor version>.<build number>.<revision>

有没有办法让版本号成为当前日期?

例如,如果我今天编译构建,版本号应该是这样的:

2016.02.11.xxxxx

如果将程序集版本设置为 1.0.0.*,通常会得到 xxxxx。

我四处搜索但没有找到答案(甚至连问题都没有)。

最佳答案

简单部分:在“项目属性”>“构建事件”中,添加“预构建事件命令行”,如下所示:

"D:\SomePath\MyAssemblyInfoPatcher.exe" "$(ProjectDir)Properties\AssemblyInfo.cs"

困难部分: 提供 MyAssemblyInfoPatcher.exe ,这是一个打开由其第一个参数指定的文件的程序,在其中搜索这一行(忽略那里的值):

[assembly: AssemblyVersion("8888.0.*")]

,用其中之一(或类似的)替换该行:

[assembly: AssemblyVersion("2016.11.05.2359")]
[assembly: AssemblyVersion("2016.1105.2359.1")]
[assembly: AssemblyVersion("8888.2016.1105.2359")]

,并重写文件。

程序根据如下模式之一从系统日期和时间导出这些值:

yyyy.mm.dd.hhmm
yyyy.mmdd.hhmm.counter
arbitrary.yyyy.mmdd.hhmm

如果您对所需的模式进行硬编码,则您的程序无需配置。对于计数器(如果您选择了它),程序可以递增它在文件中找到的值。计数器必须是字 (UInt16),这样递增 65535 就会回绕到 0。如果您希望计数器每天重置,现在您需要将引用日期存储在辅助文件中,或者可能存储在 AssemblyInfo.cs 内的注释中。对于任意数量,您可以重新使用文件中的内容,或硬编码替换。

时间问题:夏令时的开始和结束有时会使本地时间提前一小时(不是问题)和后退一小时(总是令人担忧)。为了几乎保证没有重复的时间范围,您可以使用 UTC 或本地时间,但忽略夏令时。没有夏令时的本地时间是许多 Web 服务器使用的折衷方案,甚至 VS 内置的可选的基于日期的自动版本编号(它 overrides a.b.* 为 a.b.{days since Jan. 1, 2000在 00:00}。{从 2000 年 1 月 1 日 00:00 开始的秒数除以 2},因此它不是人类可读的)。

可能的简化: •目标文件名始终是“AssemblyInfo.cs”,因此它可以在程序中指定并从参数中省略:“$(ProjectDir)Properties”。 •如果 VS 在当前目录设置为“D:\Users\myusername\Documents\Visual Studio 2010\Projects\solutionfolder\projectfolder\Properties”的情况下执行程序,它不需要参数。

•程序可以通过 System.Reflection.Assembly.GetExecutingAssembly().GetName().Version 读取其 AssemblyVersion。
•File:Properties 显示AssemblyFileVersion。
•AssemblyFileVersion(如果未指定)默认为 AssemblyVersion。

关于c# - 如何使用发布日期作为 .net 项目的程序集版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35325127/

相关文章:

C# 检查窗口是否加载

c# - 为什么 TypedReference 在幕后?它是如此快速和安全......几乎是神奇的!

C# - 使用 Dapper 构建分层数据结构

c# - 如何增加 OrmLite ServiceStack 中的命令超时?

.net - 我可以使用Web Deploy将元素插入web.config吗?

c# - 最近一篇关于 Java EE 和 .NET 比较的好文章?

c# - 服务类应该引用其他服务类还是只引用其他存储库类?

c# - 为什么这个循环再做一次迭代?

c# - Excel图表类型垂直值

c# - 从 RSS 提要字符编码转换