$在开发项目时,须要知道当前发布的究竟是哪一个版本,比较好的方式就是获取SVN的版原本做为项目的版本。项目版本通常由主版本、次版本、内部版本、修改版本四个部分组成,咱们获取的SVN版本就做为修改版本便可。这里须要利用SVN的SubWCRev.exe来实现,通常安装了SVN后都会有的。SubWCRev.exe获取SVN版本并依据模板文件,更新到相应的目标文件中。下面是具体的步骤。html
1.将项目中Properties中的AssemblyInfo.cs文件复制一份,命名为AssemblyInfo.template.cs,同时将该文件的编译属性设置为无。设置为无是为了避免让该文件不参与编译。web

同时将[assembly: AssemblyVersion("1.0.0.538")]和[assembly: AssemblyFileVersion("1.0.0.538")]修改成[assembly: AssemblyVersion("1.0.0.$WCREV$")]和[assembly: AssemblyFileVersion("1.0.0.$WCREV$")],以下图ide

其中$WCREV$是SubWCRev.exe用来匹配而后替换成最新版本号的,必需要这个名字。svn
2.在项目属性的生成事件中,添加预先生成事件命令,命令内容为SubWCRev $(SolutionDir) $(ProjectDir)Properties\AssemblyInfo.template.cs $(ProjectDir)Properties\AssemblyInfo.cs,以下图工具

3.编译生成后,能够看到AssemblyInfo.cs中的版本号已经变了,以下图post

4.代码中取得该版本号并显示,代码以下ui
this.Text += String.Format("({0})", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString());
结果以下图所示

转载请注明出处this
VS中的Properties下的AssemblyInfo.cs能够设置相应的版本号。下面是AssemblyInfo.cs设置版本的方式。
-
[assembly: AssemblyVersion("1.0.0.0")]
-
[assembly: AssemblyFileVersion("1.0.0.0")]
可是,这个须要每次都设定,并且与SVN上的版本号并不一致,追塑起来不是很方便。因此就想着取SVN上的版本号做为项目的版本号。要获得SVN的版本号,能够在SVN的节眯下,经过SVN的命令svn info来得到信息。这经过CMD命令很容易能够达到,不过,我但愿在VS编译时,每次都去获取,因此选择了在VS预生成事件命令中去执行。看下图

预生成事件命令行中输入相应的CMD命令。
1.svn info>svn_info.txt 是执行SVN命令,获取相应的版本信息,而后存到svn_info.txt的文件中。
2.findstr "Revision" svn_info.txt>..\svn_version.dll 从svn_info.txt中查找出版本号,并存到svn_version.dll中。
3.del svn_info.txt 删除svn_info.txt文件。
在编译时将会生成svn_version.dll,须要将该文件添加到项目中,以便能同时发布。这里取名为svn_version.dll,能够找成其余的名字和后缀名。
这样在项目启动时,能够经过读取svn_version.dll中的内容来获取SVN版本号。
-
-
String serverPhysicalPath = Server.MapPath(".");//WEB上,须要将服务路径转换成本地路径。若是是WinForm程序,能够获取程序路径。
-
if (!serverPhysicalPath.EndsWith("\\"))
-
-
serverPhysicalPath += "\\";
-
-
String svnVersionPath = serverPhysicalPath + "svn_version.dll";
-
StreamReader svnSteamReader = new StreamReader(svnVersionPath);
-
String line = svnSteamReader.ReadLine();
-
if (!String.IsNullOrWhiteSpace(line))
-
-
String[] temps = line.Split(':');
-
-
-
version += String.Format(".{0}", temps[1]);
-
-
-
以上是将SVN信息存成文件后,再读取来实现的。也能够考虑直接将SVN的版本信息写到AssemblyInfo.cs中,而后再获取。
在实际项目中(特别是做为产品的项目),版本号是必不可少的一部分。版本号的规则也有许多种,在此不讨论具体的编码规范。对于迭代的产品,版本繁多,特别是有多个实施项目所使用产品的版本不一样(基于定制需求)时,清楚的标识组件与代码的对应关系十分重要。
本文主要说明如何在 .Net 项目使用 SVN 做为版本控制工具时生成与代码对应的组件版本号。
咱们知道,SVN 在 commit 时会生成一串数字做为序号,因此基本思路是把这个序号做为 . Net 项目编译后生成dll的文件版本号的最后一段。下面所列方法须要使用到TortoiseSVN 提供的 SubWCRev.exe 。
首先,咱们须要经过注册表查找 TortoiseSVN 的安装目录。
1 Rem Search TSVN Path
2 For /f "tokens=*" %%i In ('Reg Query HKLM\Software\TortoiseSVN /v Directory') Do (
3 ECHO %%i | Find "Directory">NUL
4 IF %ERRORLEVEL% == 0 (For /f "tokens=1,2,*" %%j In ("%%i") Do (SET TSVN_PATH=%%1))
5 )
6 SET TSVN_PATH=%TSVN_PATH%bin\SubWCRev.exe
View Code
SubWCRev 是经过替换文件中指定的关键字来实现得到 commit 序号的,点击查看详细的列表。
而后咱们创建以一个 AssemblyInfo.tpl 做为替换使用的模板,因为 AssemblyInfo.cs 中除了固定的值外还有相似 GUID 变化的值,因此咱们不能所有替换,所以仅将须要修改的部分放在 tpl 中,内容以下:
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.$WCREV$")]
接下来使用批处理替换原来的 AssemblyInfo.cs 文件,为了在每次编译时都自动替换,咱们把调用批处理的命令写在项目生成事件的生成前事件中,例以下面这样:
"(TargetDir)BeforeBuildProject.bat""(TargetDir)BeforeBuildProject.bat"" (ProjectDir)" "$(TargetDir)AssemblyInfo.tpl" .\Properties\AssemblyInfo.cs
$(TargetDir)表示编译输出目录,更多可用全局变量请在生成事件中点击“宏”查看。
替换 AssemblyInfo.cs 的批处理代码:
1 SET WorkDir=%1
2 SET Template=%2
3 SET target=%3
4 SET AssemblyInfo=ASSEMBLY_INFO.tmp
5
6 PushD %WorkDir%
7 SET WorkDir=.\
8
9 Rem Generate a template file
10 FindStr /v "AssemblyVersion AssemblyFileVersion" %target% > %AssemblyInfo%
11 FindStr ".*" %Template% >> %AssemblyInfo%
12
13 Rem Using TSVN Replace Tlp
14 "%TSVN_PATH%" %WorkDir% %AssemblyInfo% %target%>NUL
View Code
固然这样还不是一劳永逸,你会发现每次编译 AssemblyInfo.cs 文件都会变化,所以你的 commit 序号也会一直跟着增长,这并非咱们所想要的效果。这里提出一种解决方案,在每次替换后生成 dll 后又将 AssemblyInfo.cs 还原回去。
为此,咱们在生成前事件中增长备份命令:
COPY /y "%target%" "%target%.bak">NUL
而后增长生成后事件,调用命令为:
"(TargetDir)AfterBuildProject.bat""(TargetDir)AfterBuildProject.bat"" (ProjectDir)Properties\AssemblyInfo.cs"
在 AfterBuildProject.bat 中咱们须要完成还原 AssemblyInfo.cs 和删除备份文件的工做,代码以下:
1 SET target=%1
2 COPY "%target%.bak" %target%
3 DEL /Q "%target%.bak" 2>NUL
View Code
就此,每次编译时,系统都会自动将 commit 序号放到 dll 的文件版本中了。
完整代码下载:点击下载
本文来自 NewIdea 的博客,做者 Carey Tzou 。
原文地址:http://www.cnblogs.com/NewIdea/p/AutoVersion.html
转载请注明出处,不然拒绝转载!
1、复制版本号文件 AssemblyInfo.cs
2、把复制后的文件更名为 AssemblyInfo.templet.cs
修改内容: [assembly: AssemblyVersion("1.0.0.$WCREV$")]
3、工程右键->属性->生成事件->预生成事件命令行 输入如下代码:
"C:\Program Files\TortoiseSVN\bin\SubWCRev.exe" $(ProjectDir) $(ProjectDir)Properties\AssemblyInfo.templet.cs $(ProjectDir)Properties\AssemblyInfo.cs -f
根据上面文章的参考,咱们能够根据任何逻辑生成版本号了,在程序编译以前,也就是在VS程序的生成事件中,在编译以前把版本逻辑的信息写到AssemblyInfo文件,而后再编译,其实也就是分两步: