VS中实时获取SVN的版本号并写入到AssemblyInfo.cs中
$在开发项目时,需要知道当前发布的到底是哪个版本,比较好的方式就是获取SVN的版本来作为项目的版本。项目版本一般由主版本、次版本、内部版本、修改版本四个部分组成,我们获取的SVN版本就作为修改版本即可。这里需要利用SVN的SubWCRev.exe来实现,一般安装了SVN后都会有的。SubWCRev.exe获取SVN版本并依据模板文件,更新到相应的目标文件中。下面是具体的步骤。
1.将项目中Properties中的AssemblyInfo.cs文件复制一份,命名为AssemblyInfo.template.cs,同时将该文件的编译属性设置为无。设置为无是为了不让该文件不参与编译。
同时将[assembly: AssemblyVersion("1.0.0.538")]和[assembly: AssemblyFileVersion("1.0.0.538")]修改为[assembly: AssemblyVersion("1.0.0.$WCREV$")]和[assembly: AssemblyFileVersion("1.0.0.$WCREV$")],如下图
其中$WCREV$是SubWCRev.exe用来匹配然后替换成最新版本号的,必须要这个名字。
2.在项目属性的生成事件中,添加预先生成事件命令,命令内容为SubWCRev $(SolutionDir) $(ProjectDir)Properties\AssemblyInfo.template.cs $(ProjectDir)Properties\AssemblyInfo.cs,如下图
3.编译生成后,可以看到AssemblyInfo.cs中的版本号已经变了,如下图
4.代码中取得该版本号并显示,代码如下
this.Text += String.Format("({0})", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString());
结果如下图所示
转载请注明出处
出处:https://blog.csdn.net/xxdddail/article/details/49280375
=========================================================================
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 version = "1.1.1"
- 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(':');
- if (temps.Length > 1)
- {
- version += String.Format(".{0}", temps[1]);
- }
- }
- return version;
以上是将SVN信息存成文件后,再读取来实现的。也可以考虑直接将SVN的版本信息写到AssemblyInfo.cs中,然后再获取。
出处:https://blog.csdn.net/xxdddail/article/details/38433759
=========================================================================
在实际项目中(特别是作为产品的项目),版本号是必不可少的一部分。版本号的规则也有许多种,在此不讨论具体的编码规范。对于迭代的产品,版本繁多,特别是有多个实施项目所使用产品的版本不同(基于定制需求)时,清楚的标识组件与代码的对应关系十分重要。
本文主要说明如何在 .Net 项目使用 SVN 作为版本控制工具时生成与代码对应的组件版本号。
我们知道,SVN 在 commit 时会生成一串数字作为序号,所以基本思路是把这个序号作为 . Net 项目编译后生成dll的文件版本号的最后一段。下面所列方法需要使用到TortoiseSVN 提供的 SubWCRev.exe 。
首先,我们需要通过注册表查找 TortoiseSVN 的安装目录。

Rem Search TSVN Path
For /f "tokens=*" %%i In ('Reg Query HKLM\Software\TortoiseSVN /v Directory') Do (
ECHO %%i | Find "Directory">NUL
IF %ERRORLEVEL% == (For /f "tokens=1,2,*" %%j In ("%%i") Do (SET TSVN_PATH=%%))
)
SET TSVN_PATH=%TSVN_PATH%bin\SubWCRev.exe

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 的批处理代码:

SET WorkDir=%
SET Template=%
SET target=%
SET AssemblyInfo=ASSEMBLY_INFO.tmp PushD %WorkDir%
SET WorkDir=.\ Rem Generate a template file
FindStr /v "AssemblyVersion AssemblyFileVersion" %target% > %AssemblyInfo%
FindStr ".*" %Template% >> %AssemblyInfo% Rem Using TSVN Replace Tlp
"%TSVN_PATH%" %WorkDir% %AssemblyInfo% %target%>NUL

当然这样还不是一劳永逸,你会发现每次编译 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 和删除备份文件的工作,代码如下:
SET target=%
COPY "%target%.bak" %target%
DEL /Q "%target%.bak" >NUL
就此,每次编译时,系统都会自动将 commit 序号放到 dll 的文件版本中了。
完整代码下载:点击下载
本文来自 NewIdea 的博客,作者 Carey Tzou 。
原文地址:http://www.cnblogs.com/NewIdea/p/AutoVersion.html
转载请注明出处,否则拒绝转载!
=========================================================================
、复制版本号文件 AssemblyInfo.cs 、把复制后的文件改名为 AssemblyInfo.templet.cs
修改内容: [assembly: AssemblyVersion("1.0.0.$WCREV$")] 、工程右键->属性->生成事件->预生成事件命令行 输入以下代码:
"C:\Program Files\TortoiseSVN\bin\SubWCRev.exe" $(ProjectDir) $(ProjectDir)Properties\AssemblyInfo.templet.cs $(ProjectDir)Properties\AssemblyInfo.cs -f
出处:https://www.cnblogs.com/zouhao/p/3446951.html
=========================================================================
根据上面文章的参考,我们可以根据任何逻辑生成版本号了,在程序编译之前,也就是在VS程序的生成事件中,在编译之前把版本逻辑的信息写到AssemblyInfo文件,然后再编译,其实也就是分两步:
1)调用外部命令(可以是bat或者exe等),生成版本号。
2)把版本号更新到AssemblyInfo文件中
那么你可以根据任何规则生成版本号了。
VS中实时获取SVN的版本号并写入到AssemblyInfo.cs中的更多相关文章
- VS中实时获取SVN的版本号并写入到AssemblyInfo.cs中(C#)
原文:VS中实时获取SVN的版本号并写入到AssemblyInfo.cs中(C#) 在开发项目时,需要知道当前发布的到底是哪个版本,比较好的方式就是获取SVN的版本来作为项目的版本.项目版本一般由主版 ...
- 自动获取svn的版本号
需求 在做打包时,需要获取本地svn仓库的版本号,如下所示: 下面是我试过的几种做法 SubWCRev 使用SubWCRev.exe(TortoiseSVN自带的小工具),用法简单,但获取到的版本号有 ...
- 在HTML页面中实时获取新消息的方法 “JavaScript中的setInterval用法”
JavaScript中的setInterval用法(资料来源:博主---八神吻你 ) setInterval动作的作用是在播放动画的时,每隔一定时间就调用函数,方法或对象.可以使用本动作更新来自数 ...
- MyEclipse中无法将SVN检出来的项目部署到tomcat中
自己遇到的小问题 : 要以web项目方式从svn上倒下来才可以部署到tomcat下检出步骤: myEclipse -->File-->new-->other-->svn--& ...
- iOS开发中,获取图片之后保存或下载到本地相册中
#pragma mark 先获取本地图片或者网络图片 - (void)saveHeaderImageWith:(NSString *)path { UIImage *img = [UIImage im ...
- 如何使用命令将文件夹中的文件名(包括路径)写入到txt文件中
在cmd中使用 cd /d 路径,进入当前文件夹中 使用 dir /s /b > 0.txt 如图:
- C#:通过Visual Studio项目预生成命令获取SVN版本号
之前有一个winfrom项目,想要通过获取SVN版本号作为程序的内部编译版本号.网上也有各种方法,但没有一篇行得通的方法.于是我经过一系列研究,得出了一些经验,特总结成一篇博客. 方法一:通过SVN命 ...
- C/C++中如何获取数组的长度?
C/C++中如何获取数组的长度? 收藏 C.C++中没有提供 直接获取数组长度的函数,对于存放字符串的字符数组提供了一个strlen函数获取长度,那么对于其他类型的数组如何获取他们的长度呢?其中一种方 ...
- PhpStorm中如何配置SVN,详细操作方法 - 郑加全的博客 - CSDN博客
登录|注册 郑加全的博客 目录视图 摘要视图 订阅 CSDN日报0711——<离开校园,入职阿里,开启新的程序人生> 征文 | 你会为 AI 转型么? ...
随机推荐
- VS2010编译Unigine_2010源码
VS2010编译Unigine_2010源码[Debug版本] 1.Laucher工程属性改为控制台项目 2.Unigine工程编译时的Warnning LNK2019 a.属性--常规-目标文件名改 ...
- 对FPGA的时钟资源理解(更新中)
7系列FPGA中包含了多达24个CMT(时钟管理单元)(实际上V7常见只有20个),MMCM和PLL均为时钟综合器,对外部输入时钟.内部时钟进行处理,生成需要的低抖动时钟.PLL是MMCM的功能子集, ...
- rancher中使用ingress-lbs做负载均衡
rancher 相关资料 http://rancher.com/docs/rancher/v1.6/zh/kubernetes/ingress/ lvs, haproxy, nginx负载均衡器比较 ...
- request的响应时间elapsed和超时timeout
前言:requests发请求时,接口的响应时间,也是我们需要关注的一个点,如果响应时间太长,也是不合理的 1.获取接口请求的响应时间 r.elapsed.total_seconds() import ...
- day 55 前端
前端JQuery 语法 1 关于表格基数偶数背景颜色变换的 2 关于has后代 和not非 3 jQuery 和dom的转换 dom 转换成jQuery 用$(包起来) 不加引号 4 关于 n ...
- python 应用 pyamg
paper idea要用到pyamg,虽然这个包只有几行代码,但是还是折磨了我挺久,配置环境什么的就废了挺多时间. 好久没用pyamg了,然后又换了电脑,突然感觉有点方,,都忘了之前怎么弄的,今天运行 ...
- PHP安全之webshell和后门检测(转)
基于PHP的应用面临着各种各样的攻击: XSS:对PHP的Web应用而言,跨站脚本是一个易受攻击的点.攻击者可以利用它盗取用户信息.你可以配置Apache,或是写更安全的PHP代码(验证所有用户输入) ...
- 【】opencv窗口创建、大小调整等问题
opencv窗口创建.大小调整等问题 图像最开始大小可能为1280*720或者其他大小的: 使用cv::resizeWindow函数之后,不同的参数感觉窗口大小没有多少改变,看不出来: 使用cv::s ...
- Python 金融数据分析库及相关框架
BackTest框架库: PyAlgoTrade ZipLine 金融数据分析库: pandas
- Linux系统修改Home下的目录为英文
修改Home下的目录为英文 修改目录映射文件名: vim .config/user-dirs.dirs 修改如下:XDG_DESKTOP_DIR="$HOME/Desktop"XD ...