C#通过项目预处理事件获取SVN版本号

来源:互联网 发布:js原型链继承 编辑:程序博客网 时间:2024/06/07 19:15


      先在项目的Properties目录下新建一个“AssemblyInfo.template.cs”的模板类文件,并把“AssemblyInfo.cs”文件从SVN版本号中忽略(不忽略也可以,因为每次都会更改此文件,所以该文件总是会更新,后面说解决)。在模板文件中写下类似的代码:(其实就是把AssemblyInfo.cs文件复制一遍就好,但是该文件属性编译属性要设置为无,该文件只是为了读取svn版本号,不需要编译,不然会报错,因为和原文件字段重复)。就是改最后两行代码。¥WCREV¥是svn查找并替换字段。

复制代码
 1 using System.Reflection; 2 using System.Runtime.CompilerServices; 3 using System.Runtime.InteropServices; 4  5 // 有关程序集的常规信息通过以下 6 // 特性集控制。更改这些特性值可修改 7 // 与程序集关联的信息。 8 [assembly: AssemblyTitle("程序名")] 9 [assembly: AssemblyDescription("更新时间:$WCDATE$")]10 [assembly: AssemblyConfiguration("")]11 [assembly: AssemblyCompany("")]12 [assembly: AssemblyProduct("程序名")]13 [assembly: AssemblyCopyright("Copyright © 2013")]14 [assembly: AssemblyTrademark("")]15 [assembly: AssemblyCulture("")]16 17 // 将 ComVisible 设置为 false 使此程序集中的类型18 // 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型,19 // 则将该类型上的 ComVisible 特性设置为 true。20 [assembly: ComVisible(false)]21 22 // 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID23 [assembly: Guid("18501865-f051-43be-ab03-59a2d9e76fcf")]24 25 // 程序集的版本信息由下面四个值组成:26 //27 //      主版本28 //      次版本 29 //      内部版本号30 //      修订号31 //32 // 可以指定所有这些值,也可以使用“内部版本号”和“修订号”的默认值,33 // 方法是按如下所示使用“*”:34 // [assembly: AssemblyVersion("1.0.*")]35 [assembly: AssemblyVersion("1.1.1.$WCREV$")]36 [assembly: AssemblyFileVersion("1.1.1.$WCREV$")]
复制代码

      然后在项目属性的生成事件中编写如下预先生成事件执行的命令:(此处应该注意 这是一条命令,不能分行写,此处排版问题,因为这个问题楼主郁闷好久,不熟悉命令预生成命令行尴尬

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

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

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

因为每次都会更改assemblyinfo.cs文件,所以该文件每次都需要svn提交,有利有弊,如果不想每次该文件都有改动,可以参照以下方法。

原理是每次修改前备份改文件,生成完之后再还原

在预生成命令行 修改该文件之前增加命令 copy /y $(ProjectDir)Properties\AssemblyInfo.cs $(ProjectDir)Properties\AssemblyInfo.cs.bak

在后期生成事件命令行中还原 copy /y $(ProjectDir)Properties\AssemblyInfo.cs.bak $(ProjectDir)Properties\AssemblyInfo.cs


   实际效果如下图所示:

   

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

复制代码
1   /// <summary>2   /// 版本号3   /// </summary>4   public static string AppVersion5    {6         set { AppDomain.CurrentDomain.SetData("AppVersion", value); }7         get { return AppDomain.CurrentDomain.GetData("AppVersion") == null ? "" : AppDomain.CurrentDomain.GetData("AppVersion").ToString(); }8    }
复制代码

  这样就大功告成啦!!!

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

复制代码
 1 /// <summary> 2 /// 获取文件的版本号 3 /// </summary> 4 /// <param name="filePath">文件的完整路径</param> 5 /// <returns>文件的版本号</returns> 6 public static string GetFileVersion(string filePath) 7 { 8     string FileVersions = ""; 9 10     try11     {12         System.Diagnostics.FileVersionInfo file1 = System.Diagnostics.FileVersionInfo.GetVersionInfo(filePath);13         FileVersions = file1.FileVersion;14         if (FileVersions != "")15         {16             string[] strVer = FileVersions.Split('.');17             if (strVer.Length == 2)18             {19                 FileVersions = strVer[0] + ".00.0000";20             }21 22         }23     }24     catch (Exception ex)25     {26         FileVersions = "";27     }28     return FileVersions;29 }
原创粉丝点击