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 }
- C#通过项目预处理事件获取SVN版本号
- 利用VS的预生成事件获取SVN版本作为项目内部版本号
- VS下 C#项目使用SVN版本号
- 用shell脚本获取svn版本号,作为项目的小版本号
- c#获取程序版本号
- vb.net 预生成事件获取SVN版本号,编译日期,版本日期
- iOS Xcode 获取项目版本号
- 自动获取svn版本号并替换android版本号
- 在程序内动态获取svn版本号
- 命令获取svn 版本号 最后修改版本
- qmake获取svn版本号加入工程
- 获取svn版本号并替换AndroidManifest
- 在VS项目中使用SVN版本号作为编译版本号
- 通过SQL语句获取ORACLE的版本号
- android 通过apk获取版本号versionCode
- VC 通过mshtml.dll获取ie版本号
- 如何通过adb 获取应用的版本号
- 通过svn检出项目
- 【SignalR学习系列】3. SignalR实时高刷新率程序
- leetcode 125
- 黑马商城项目_导航条圆点的定位
- 迭代器的内部类实现
- Spark简单函数 JAVA/SCALA
- C#通过项目预处理事件获取SVN版本号
- string的特性
- 【Android】oui.txt格式化的sqlite数据库文件直接导入
- MINI TUTORIAL: NEWSLETTER POPUP IN MAGENTO (WITH COOKIE)
- func_get_args()、func_get_arg()与func_num_args()
- Python支持的所有转移序列
- 【SignalR学习系列】4. SignalR广播程序
- 【SignalR学习系列】5. SignalR WPF程序
- adb 使用 wifi 连接设备