简单部分: 在项目属性 > 构建事件 中,添加一个“预构建事件命令行”,如下所示:
"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")]
程序从系统日期和时间中获取这些值,根据以下模式之一进行转换:
1. <yyyyMMddHHmmss>,即年月日时分秒
2. <yyyy-MM-dd HH:mm:ss>,即年-月-日 时:分:秒
并且重写文件。
yyyy.mm.dd.hhmm
yyyy.mmdd.hhmm.counter
arbitrary.yyyy.mmdd.hhmm
如果你硬编码你想要的模式,你的程序不需要配置。对于计数器(如果你选择了它),程序可以增加在文件中找到的值。计数器必须是单词(UInt16),这样当增加到65535时会回到0。如果你希望计数器每天重置一次,现在你需要存储一个参考日期,在一个侧面文件中或者可能在AssemblyInfo.cs的注释中。对于任意数字,你可以重用文件中的内容,或者硬编码替换。
时间问题:夏令时的开始和结束使得本地时间偶尔向前跳动一个小时(不是问题),并且向后跳动一个小时(总是很担心)。为了几乎保证没有重复的时间范围,你可以使用UTC或者也许是本地时间,忽略夏令时。许多Web服务器使用没有夏令时的本地时间,甚至是VS内置的可选自动基于日期的版本编号功能(它用a.b.*覆盖a.b.{自2000年1月1日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。文件:Properties 显示AssemblyFileVersion。如果没有指定AssemblyFileVersion,则默认为AssemblyVersion。
x.y.*
,其中构建号是自2000年以来的天数,修订号是午夜后经过的秒数除以2。 - Hans Passant