• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请


      先在项目的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 用于类型库的 ID
23 [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 AppVersion
5    {
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     try
11     {
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 }






鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap