在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#文件解析和处理 → 通过Visual Studio项目预生成命令获取SVN版本号

通过Visual Studio项目预生成命令获取SVN版本号

C#文件解析和处理

下载此实例
  • 开发语言:C#
  • 实例大小:1.35KB
  • 下载次数:8
  • 浏览次数:459
  • 发布时间:2015-12-27
  • 实例类别:C#文件解析和处理
  • 发 布 人:hshowq
  • 文件格式:.cs
  • 所需积分:3
 相关标签: SVN 版本号

实例介绍

 之前有一个winfrom项目,想要通过获取SVN版本号作为程序的内部编译版本号。网上也有各种方法,但没有一篇行得通的方法。于是我经过一系列研究,得出了一些经验,特总结成一篇博客。

方法一:通过SVN命令获取版本号

     类似地,我在项目中添加了一个名为"Version_inf.bat"的用于生成版本号的批处理文件,把他放在启动项目的目录中。批处理文件中写下如下脚本:

1 svn info>bin\Debug\SVN_Version.dll 2 findstr “Revision” bin\Debug\SVN_Version.dll

     这段脚本的意思是通过“svn info”命令获取“Revision”版本信息到Debug的输出目录的“SVN_Version.dll”文件中。(前提是电脑上必须安装了svn软件才能正常使用此命令。)

     在程序的Program主入口中,写上类似的代码:

string str_PathResult = null;
    Microsoft.Win32.RegistryKey regKey = null;//表示 Windows 注册表中的项级节点(注册表对象?) 
    Microsoft.Win32.RegistryKey regSubKey = null;
    try
    {
        regKey = Microsoft.Win32.Registry.LocalMachine;//读取HKEY_LOCAL_MACHINE项

        if (regKey != null)
        {
            string keyPath = @"SOFTWARE\TortoiseSVN";
            regSubKey = regKey.OpenSubKey(keyPath, false);
        }
        //得到SVN安装路径
        if (regSubKey != null)
        {
            if (regSubKey.GetValue("Directory") != null)
            {
                str_PathResult = regSubKey.GetValue("Directory").ToString();
            }
        }

        //如果存在SVN安装信息,则通过调用批处理获取版本号
        if (str_PathResult != null)
        {
            string path = System.Environment.CurrentDirectory;
            ////删除已经存在的版本信息,避免出现串号
            //if (File.Exists(path   "\\SVN_Version.dll"))
            //{
            //    File.Delete(path   "\\SVN_Version.dll");
            //}

            int pathNum = path.LastIndexOf("\\") - 3;
            ProcessStartInfo psi = new ProcessStartInfo();

            string pathStr = path.Substring(0, pathNum)   "Version_inf.bat";
            //string newPathStr = (pathStr.Substring(0, pathStr.LastIndexOf(".")))   ".bat";

            psi.FileName = pathStr;
            //psi.FileName = path.Substring(0, pathNum)   "Version_inf.bat";
            psi.UseShellExecute = false;
            psi.WorkingDirectory = path.Substring(0, pathNum).Substring(0, path.Substring(0, pathNum).Length - 1);
            psi.CreateNoWindow = true;
            Process.Start(psi);
        }
    }
    catch (Exception ex)
    {
        //MessageBox.Show("检测SVN信息出错,"   ex.ToString(), "提示信息");
        //LogUtil.WriteException(ex, "Program.Main()");
    }
    finally
    {
        if (regKey != null)
        {
            regKey.Close();
            regKey = null;
        }

        if (regSubKey != null)
        {
            regSubKey.Close();
            regSubKey = null;
        }
    }

        这样每次程序编译的时候就会生成一个新的“SVN_Version.dll”文件,里面记录了最后一次更新的记录版本号。

        然后在主窗口读取“SVN_Version.dll”文件中的版本信息显示到程序的主界面上,代码如下:

      这样就完成了SVN版本号的获取和内部编译号的显示了。如下图:

      

      但是这种的方法的问题是:

     1)svn命令在程序没有变化或者没有获取最新版本时会无法生成版本号;

     2)只是在主界面显示了版本号,但是并没有真正改变项目生成文件的版本号;

     3)如果电脑中没有安装svn程序,则极有可能会出现错误; 

      所以我又研究了方法二。

 

方法二:通过项目预处理事件获取SVN版本号

      先在项目的Properties目录下新建一个“AssemblyInfo.template.cs”的模板类文件,并把“AssemblyInfo.cs”文件从SVN版本号中忽略。(模板文件详见附件)

      然后在项目属性的生成事件中编写如下预先生成事件执行的命令:

 $(SolutionDir)Lib\SubWCRev.exe $(SolutionDir) $(ProjectDir)Properties\AssemblyInfo.template.cs $(ProjectDir)Properties\AssemblyInfo.cs -f

   这段话的意思就是找到SVN的SubWCRev.exe文件,获取到版本信息后通过模板将数据写入到“AssemblyInfo.cs”文件中。

   这样每次生成之后版本号就写入到了项目输出的文件中。将每个项目都按照如上方法添加模板和预生成事件,那么程序文件就会都带有版本信息。

   实际效果如下图所示:

   

   程序在显示的时候,可以通过封装一个公共属性让其他人可以调用到版本号信息:

/// <summary>
  /// 版本号
  /// </summary>
  public static string AppVersion
   {
        set { AppDomain.CurrentDomain.SetData("AppVersion", value); }
        get { return AppDomain.CurrentDomain.GetData("AppVersion") == null ? "" : AppDomain.CurrentDomain.GetData("AppVersion").ToString(); }
   }

  这样就大功告成啦!!!

  当然如果想获取项目生成的文件或者想获取某个指定文件的版本号属性,可以使用如下方法:


/// <summary>
/// 获取文件的版本号
/// </summary>
/// <param name="filePath">文件的完整路径</param>
/// <returns>文件的版本号</returns>
public static string GetFileVersion(string filePath)
{
    string FileVersions = "";

    try
    {
        System.Diagnostics.FileVersionInfo file1 = System.Diagnostics.FileVersionInfo.GetVersionInfo(filePath);
        FileVersions = file1.FileVersion;
        if (FileVersions != "")
        {
            string[] strVer = FileVersions.Split('.');
            if (strVer.Length == 2)
            {
                FileVersions = strVer[0]   ".00.0000";
            }

        }
    }
    catch (Exception ex)
    {
        FileVersions = "";
    }
    return FileVersions;
}


标签: SVN 版本号

实例下载地址

通过Visual Studio项目预生成命令获取SVN版本号

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

第 1 楼 家淘网 发表于: 2015-12-27 16:25 15
不错啊,赞一个

支持(0) 盖楼(回复)

发表评论

(您的评论需要经过审核才能显示)

查看所有1条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警