C#專案版本號自定義位置自動向上增加小工具設計與實現

thyou發表於2022-02-16

  自從畢了業,好久沒更新了,今天突發奇想,過來更新一下,嘻嘻!

  一般在做版本升級時,要鎖定版本號進行對比,然後聯網檢索可用的升級包資訊,在用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配置好的專案,即可修改相應的值,結果如下圖:

  

 

相關文章