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

时间:2016-02-10 20:20:55

标签: c# .net

我知道汇编版本的格式是:

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

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

例如,如果我今天编译构建版本,版本号应如下所示:

2016.02.11.xxxxx

如果将程序集版本设置为1.0.0。*。

,则通常会获得xxxxx

我用Google搜索,但没有找到答案(甚至不是问题)。

2 个答案:

答案 0 :(得分:3)

简单部分:在项目属性&gt;构建事件,添加&#34;预构建事件命令行&#34;像这样:

"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内置的可选自动基于日期的版本编号(它覆盖 ab * with ab {days自2000年1月1日起在00:00}。{自2000年1月1日00:00后的秒数除以2},所以它不是人类可读的。)

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

•程序可以通过System.Reflection.Assembly.GetExecutingAssembly()。GetName()。版本读取其AssemblyVersion。 •文件:属性显示AssemblyFileVersion •AssemblyFileVersion(如果未指定)默认为AssemblyVersion。

答案 1 :(得分:1)

这可以通过MSBUILD完成。 Here是一个很好的描述。 您不需要构建服务器。您可以在项目的BeforeBuild目标中调用自定义MSBUILD目标。为此,使用编辑器打开csproj文件,并在文件末尾找到此部分:

<!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
       Other similar extension points exist, see Microsoft.Common.targets.
  <Target Name="BeforeBuild">
  </Target>
  <Target Name="AfterBuild">
  </Target>
  -->