JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » .Net Framework » .net 家族语言: C#, VB.net F#等  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to postflat modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 在 Project Build 時,自動增加執行檔的版本號碼
CMHuang

妳喜歡我的大象嗎?(羞)

版主

發文: 81
積分: 4
於 2008-03-27 22:32 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
這個功能滿難說明的,所以標題才這麼奇怪。
不過我的目的就是要在每次 project build 時,自動更動執行檔的版本號碼。
(例如: 1.0.0327.104 -> 主版本.次版本.日期.當日的第幾次 build)

ClickOnce 有提供類似的功能,不過如果不是用 ClickOnce 發佈或是想自訂版本號碼的人。
或許可以參考我這裡在網路上撿骨頭修修改改的辦法。

1. 首先,我們知道 project build 出來的應用程式會使用 Properties/AssemblyInfo.cs 內的
1
2
[assembly: AssemblyVersion("1.0.0327.104")]
[assembly: AssemblyFileVersion("1.0.0327.104")]

所以我們可以寫一個簡單的小程式在 project build 前,更動代表版本的這兩行。

2.
要讓 project build 前執行某個程式,可以修改 [專案名稱].csproj 檔案
1
2
3
4
5
6
7
8
9
10
11
<Project ...>
<UsingTask TaskName="BuildTasks.AddBuildNum" AssemblyFile="BuildTasks.dll" />
...
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
  <Target Name="BeforeBuild">
    <AddBuildNum AssemblyFileLocation="$(MSBuildProjectDirectory)\Properties\AssemblyInfo.cs">
    </AddBuildNum>
  </Target>
  <Target Name="AfterBuild">
  </Target>
</Project>


這邊 BuildTasks.dll 是等下我們要建立的小程式
然後我們在 BeforeBuild 指定 AssemblyFileLocation 為 AssemblyInfo.cs 的檔案位置。
(第 2 點,算先介紹有這個地方可以設定,實際上是先做後面的第 3 點比較順利)

3.
新增一個 BuildTasks 的專案(專案設定裡的輸出類型,請用「類別庫」),
裡面只有一個 AddBuildNum.cs
大概就是先比對日期部份相同,就把後面的 build number + 1
下面程式碼意思一下就好了。 XD
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
 
namespace BuildTasks
{
    public class AddBuildNum : Task
    {
        String assemblyFileLocation = "";
        public String AssemblyFileLocation
        {
            get { return assemblyFileLocation; }
            set { assemblyFileLocation = value; }
        }
 
        public override bool Execute()
        {
            return IncrementVersion();
        }
 
        private bool IncrementVersion()
        {
            //主要版本.次要版本.組建編號(日期).修訂編號
            try
            {
                if (File.Exists(assemblyFileLocation))
                {
                    String str = File.ReadAllText(assemblyFileLocation);
                    Match m = Regex.Match(str, @"\[assembly:\sAssemblyFileVersion\(\""(?<ver>.+)\""\)\]");
                    String ver = m.Groups["ver"].Value;
                    String[] strs = ver.Split('.');
 
                    String bn = String.Format("{0:00}{1:00}", DateTime.Today.Month, DateTime.Today.Day);
 
                    if (!strs[2].Equals(bn))
                    {
                        //「組建編號」不一樣「修訂編號」歸零
                        strs[3] = "0";
                    }
                    else
                    {
                        //「組建編號」一樣「修訂編號」加一
                        strs[3] = Convert.ToString(Convert.ToInt32(strs[3]) + 1);
                    }
                    strs[2] = bn;
 
                    String newver = String.Join(".", strs);
 
                    str = Regex.Replace(str, @"\[assembly:\sAssemblyVersion\(\""(?<ver>.+)\""\)\]",
                        String.Format("[assembly: AssemblyVersion(\"{0}\")]", newver));
 
                    str = Regex.Replace(str, @"\[assembly:\sAssemblyFileVersion\(\""(?<ver>.+)\""\)\]",
                        String.Format("[assembly: AssemblyFileVersion(\"{0}\")]", newver));
 
                    File.WriteAllText(assemblyFileLocation, str, Encoding.UTF8);
 
                    return true;
                }
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
            return false;
        }       
    }
}


4.
最後,把這個 BuildTask.dll 放進你需要使用的專案目錄裡。
之後每次 build 你的專案,就會自動更新版本號碼了。
你也可以在執行時,取得執行檔的版本號碼:
1
2
FileVersionInfo info = FileVersionInfo.GetVersionInfo("執行檔.exe");
string 版本號碼 = info.FileVersion;

可喜可賀! 可喜可賀!

註:
1.
如果重新載入你需要使用的專案, Visual Studio 會給一安全性的提示。
因為你寫了一個類似外掛的東西,Visual Studio 會提醒你一下。

2.
我是用 Visual Studio 2005
新版的 Visual Studio 2008 方法應該一樣(?)


CMHuang edited on 2008-03-27 23:11
reply to postreply to post
話題樹型展開
人氣 標題 作者 字數 發文時間
2163 在 Project Build 時,自動增加執行檔的版本號碼 CMHuang 3942 2008-03-27 22:32
» JWorld@TW »  .Net Framework » .net 家族语言: C#, VB.net F#等

reply to postflat modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8