首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

贴一个C#下生成一次自动增多版本号的代码

2013-09-28 
贴一个C#下生成一次自动增加版本号的代码VB中,每生成一次,能自动增加工程属性的版本号,C#下默认是每发布一

贴一个C#下生成一次自动增加版本号的代码
VB中,每生成一次,能自动增加工程属性的版本号,C#下默认是每发布一次才增加,而生成时不会,这样很没成就感。本想用这个工具:http://autobuildversion.codeplex.com/releases/view/40744,但没成功,后面想到直接对 AssemblyInfo.cs 进行修改即可。调试出如下代码,贴出让与我有相同习惯的朋友参考(这种方式对多人开发模式就不好用了):

namespace T035
{
    #region 例行using语句
    using System;
    using System.Windows.Forms;
    #endregion

    /// <summary>
    /// 编译时,项目版本号自动加1的工具
    /// <para>简单模式的编程思路:</para>
    /// <para>取项目 AssemblyInfo.cs 文件中的版本号</para>
    /// <para>找到指定内容的行,版本号加1,保存回去,完事</para>
    /// <para>使用方法:</para>
    /// <para>VS2008中打开要处理的项目,对其属性下的生成事件页签,预生成事件命令行输入</para>
    /// <para><code>T035 "$(ProjectDir)"</code></para>
    /// <para>T035前面要不要指定路径就由你自己决定了,最简单的,就是把T035.exe放到System32目录</para>
    /// </summary>
    public static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// <para>需要带参数</para>
        /// </summary>
        /// <param name="args">要处理的项目 所在的路径,在VS中可以直接用宏$(ProjectDir)表示</param>
        [STAThread]
        public static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                MessageBox.Show("工具T035没有设置参数,应该要设为:T035 "$(ProjectDir)"");
                Application.Exit();
                return;
            }
            else if (args.Length > 1)
            {
                MessageBox.Show("工具T035有多个参数,是不是你的命令行没带双引号,而项目路径又带空格?");
                Application.Exit();
                return;
            }

            string sPath = args[0].Replace(""", string.Empty) + "\\Properties\";
            string sAssemOld = sPath + "AssemblyInfo.old";
            string sAssem = sPath + "AssemblyInfo.cs";
            string sAssemNew = sPath + "AssemblyInfo.new";

            // 检测AssemblyInfo文件是否存在来决定路径是否设置正确
            if (System.IO.File.Exists(sAssem) == false)
            {
                string sInfo =
                    "未检测到文件存在:" + sAssem + "\r\n" +
                    "路径是否有设置错误?";
                MessageBox.Show(sInfo);
                Application.Exit();
                return;
            }

            // TODO: 自行检测文件是否只读等问题
            System.IO.StreamReader oSR = new System.IO.StreamReader(sAssem);
            System.IO.StreamWriter oSW = new System.IO.StreamWriter(
                sAssemNew,
                false,
                oSR.CurrentEncoding);



            string sLine = string.Empty;
            string sNewLine = string.Empty;
            while ((sLine = oSR.ReadLine()) != null)
            {
                if ((sLine.IndexOf("[assembly: AssemblyVersion") == 0) ||
                    (sLine.IndexOf("[assembly: AssemblyFileVersion") == 0))
                {
                    // 找到这两行了,修改它们
                    sNewLine = VerAdd(sLine);
                }
                else
                {
                    sNewLine = sLine;
                }

                oSW.WriteLine(sNewLine);
            }

            oSW.Close();
            oSR.Close();

            // 备份文件删除(只读属性时将会出错)
            if (System.IO.File.Exists(sAssemOld) == true)
            {
                System.IO.File.Delete(sAssemOld);
            }

            // 原文件改名备份(只读属性下允许正常改名)
            System.IO.File.Move(sAssem, sAssemOld);

            // 新文件改为原文件(原只读属性将会丢失)
            System.IO.File.Move(sAssemNew, sAssem);
        }

        /// <summary>
        /// 对输入的字符串, 取其中版本最后部分+1
        /// </summary>
        /// <param name="sLine">输入的字符串,类似:[assembly: AssemblyVersion("1.0.0.4")]</param>
        /// <returns>版本最后部分+1 后的结果</returns>
        private static string VerAdd(string sLine)
        {
            // 定位起始位置与结束位置
            int lPos1 = sLine.IndexOf("("");
            if (lPos1 < 0)
            {
                MessageBox.Show("该字符串找不到版本号起始标志(":" + sLine);
                Environment.Exit(0);
            }

            int lPos2 = sLine.IndexOf("")", lPos1);
            if (lPos2 < 0)
            {
                MessageBox.Show("该字符串找不到版本号结束标志"):" + sLine);
                Environment.Exit(0);
            }

            // TODO: 自行去保证数据正确性,例如:1.0.7 或 1.0.0.7A
            string[] sVer = sLine.Substring(lPos1 + 2, lPos2 - lPos1 - 2).Split('.');
            string sNewLine = sLine.Substring(0, lPos1 + 2) +
                sVer[0] + "." + sVer[1] + "." + sVer[2] + "." + (int.Parse(sVer[3]) + 1).ToString() + "")]";


            return sNewLine;
        }
    }
}


[解决办法]
AssemblyInfo.cs中这样
[assembly: AssemblyVersion("1.0.1.*")]

最后一个*的意思是每次build都变,但是不是增加1 .
[解决办法]
C#下默认是每发布一次才增加,是这样?没注意到!

热点排行