C#项目版本号自定义位置自动向上增加小工具设计与实现
自从毕了业,好久没更新了,今天突发奇想,过来更新一下,嘻嘻!
一般在做版本升级时,要锁定版本号进行对比,然后联网检索可用的升级包信息,在用VS做C#项目组件版本管理时,是一个很麻烦的事,每次Release之前都要硬核的去改AssemblyInfo.cs文件的版本信息,采用VS官方推荐的[assembly: AssemblyVersion("1.0.*")]格式最后生成的版本号是1.0.1589.39645之类的,留给自定义的只剩下前两位,对于有个性的开发者明显彰显不出咱们的个性,所以下面和大家说一个相对来说比较好用的方法或逻辑,假设能有一个小程序在每次Release之前,去自动修改AssemblyInfo.cs文件中对应的版本号,代替我们手动去修改,修改的值为某年某月某日到今天发布的累计小时数,就达到了自动修改并向上叠加的目的,废话不多说,上正文。
右击项目属性,选择“生成事件”,输入如下命令:
1 if $(ConfigurationName)==Release 2 ( 3 "$(SolutionDir)AutoVersion.exe" $(ProjectDir) 4 )
如下图所示
其中的参数意义,可点击“编辑预先生成”按钮后,打开编辑界面,点击“宏”按钮查看相应变量的值,此处不做过多的解释,只需要记住这个是用于调用AutoVersion.exe程序并把当前项目文件的根路径作为参数传进去的作用就行了,
下面说一下AutoVersion.exe程序的具体逻辑,首先获取AssemblyInfo.cs问价的路径,然后读取该文件中的AssemblyVersion的值,并对其进行修改,然后重新写入到文件中,具体代码如下:
1 using System; 2 using System.Collections.Generic; 3 using System.IO; 4 using System.Linq; 5 using System.Text; 6 using System.Xml; 7 8 namespace AutoVersion 9 { 10 class Program 11 { 12 static void Main(string[] args) 13 { 14 try 15 { 16 if (args.Length <= 0) 17 return; 18 if (!Directory.Exists(args[0])) 19 return; 20 string strPath = Path.Combine(args[0] + "/Properties/AssemblyInfo.cs"); 22 if (File.Exists(strPath)) 23 { 24 string[] strinfo = File.ReadAllLines(strPath, Encoding.UTF8); 25 DateTime startTime = new DateTime(2020, 1, 1); 26 TimeSpan ts = DateTime.Now - startTime; 27 int littleVersion = ts.Hours + ts.Days * 24; 28 29 for (int i = 0; i < strinfo.Length; i++) 30 { 31 string startStr = "AssemblyVersion(\""; 32 string endStr = "\")]"; 33 string pointStr = "."; 34 if (strinfo[i] != "" && strinfo[i].Contains(startStr) && strinfo[i].Contains(endStr) && strinfo[i].Contains(pointStr)) 35 { 36 string[] strArr = strinfo[i].Split('.'); 37 if (strArr != null && strArr.Length == 4) 38 { 39 int startIndex = strinfo[i].LastIndexOf(pointStr) + 1; 40 int endIndex = strinfo[i].IndexOf(endStr); 41 if (endIndex > startIndex) 42 { 43 string headerStr = strinfo[i].Substring(0, startIndex); 44 string enderStr = strinfo[i].Substring(endIndex, strinfo[i].Length - endIndex); 45 strinfo[i] = headerStr + littleVersion + enderStr; 46 } 47 } 48 } 49 } 50 File.WriteAllLines(strPath, strinfo, Encoding.UTF8); 51 } 52 } 53 catch (Exception ex) 54 { 55 Console.WriteLine(ex.ToString()); 56 } 57 } 58 } 59 }
Release生成AutoVersion.exe文件,放到 $(SolutionDir) 的值所在的文件夹内,重新Release配置好的项目,即可修改相应的值,结果如下图: