名称 英文 说明
主版本号 major 具有相同名称但不同主版本号的程序集不可互换。例如,这适用于对产品的大量重写,这些重写使得无法实现向后兼容性。当有极大的更新时,会增加major的版号
子版本号 minor 如果两个程序集的名称和主版本号相同,而次版本号不同,这指示显著增强,但照顾到了向后兼容性。例如,这适用于产品的修正版或完全向后兼容的新版本。而当有大更新,但不至于更新major时,会更新minor的版号
编译版本号 build 内部版本号的不同表示对相同源所作的重新编译。这适合于更改处理器、平台或编译器的情况。若更新比较小,例如只是除虫(bug fixing),则会更新build的版号
修正版本号 revision 名称、主版本号和次版本号都相同但修订号不同的程序集应是完全可互换的。这适用于修复以前发布的程序集中的安全漏洞。程序集的只有内部版本号或修订号不同的后续版本被认为是先前版本的修补程序 (Hotfix) 更新。当在同一个Build下需要重新编译,那么就需要增加Revision即可
  • 版本号的最大值是65535,所以使用AssemblyFileVersion不受这个限制

参考资料

方案

方案一

那是在项目的预生成,事件中:

  1. echo [assembly:System.Reflection.AssemblyFileVersion("%date:~0,4%.%date:~5,2%%date:~8,2%.%time:~0,2%%time:~3,2%.%time:~6,2%")] > $(ProjectDir)Properties\VersionInfo.cs
  • 将生成的VersionInfo.cs文件(Properties子文件夹)包含到项目中.

方案二:Cake支持AssemblyInfo文件修补

方案三

  1. if (System.Diagnostics.Debugger.IsAttached)
  2. {
  3. var path = Environment.CurrentDirectory.Substring(0, Environment.CurrentDirectory.LastIndexOf("\\bin\\")) + @"\Properties\AssemblyInfo.cs";
  4. if (System.IO.File.Exists(path))
  5. {
  6. var lins = System.IO.File.ReadAllLines(path, System.Text.Encoding.UTF8);
  7. var isChange = false;
  8. for (int i = lins.Length - 1; i > 0; i--)
  9. {
  10. if (lins[i].StartsWith("[assembly: AssemblyVersion"))
  11. {
  12. lins[i] = $"[assembly: AssemblyVersion(\"1.{ DateTime.Now.ToString("yyyy.MM.dd")}\")]";
  13. isChange = true;
  14. }
  15. if (lins[i].Contains("[assembly: AssemblyFileVersion"))
  16. {
  17. lins[i] = $"[assembly: AssemblyFileVersion(\"1.{ DateTime.Now.ToString("yyyy.MM.dd")}\")]";
  18. isChange = true;
  19. }
  20. }
  21. if (isChange)
  22. {
  23. System.IO.File.WriteAllLines(path, lins, System.Text.Encoding.UTF8);
  24. }
  25. }
  26. }