前言
VS项目的版本号由四位数字组成,a.b.c.d。风格有两种:
- 主版本号 . 子版本号 [. 修正版本号 [. 编译版本号 ] ]
- 主版本号. 子版本号 [ 编译版本号 [. 修正版本号 ] ]
编译版本号在源代码编译时递增。
我采用的是第二种版本号风格,想要VS编译时自动递增这个号。于是我编写了IncBuildNo来完成这个任务。
IncBuildNo是个命令行工具,与VS配合即可完成递增版本号的任务。如果你采用第一种版本号风格,IncBuildNo也能很好地胜任。IncBuildNo甚至可以干别的递增数字的工作,不仅仅是版本号,因为运行它时需要的参数之一是正则表达式。
安装与运行
- 复制IncBuildNo.exe到你的硬盘,例如C:\windows\IncBuildNo.exe
- 在Visual Studio中打开任意一个项目或解决方案, 在菜单上选择 项目 - >XXX属性- >生成事件
- 在后期生成事件命令行中输入命令:
IncBuildNo.exe "$(PROJECTDIR)\Properties\AssemblyInfo.cs" "\[assembly: AssemblyVersion\(\"\d+\.\d+\.\d+\.(\d+)" 1
- 运行后期生成事件 选择 当生成更新项目输出时
按F6编译此项目,假如原来版本号是1.2.3.4,它会递增为1.2.3.5。
如果你跟我一样,采用第二种版本号风格,命令就是
- IncBuildNo "$(ProjectDir)Properties\AssemblyInfo.cs" "\[assembly: AssemblyVersion\(\"\d+\.\d+\.(\d+)" 1
IncBuildNo "$(ProjectDir)Properties\AssemblyInfo.cs" "\[assembly: AssemblyVersion\(\"\d+\.\d+\.(\d+)" 1
下载
http://incrbuildnum.codeplex.com/releases/view/79528
技术支持截至2012年6月28日。
文档
更多参数设定请参考http://incrbuildnum.codeplex.com/documentation。
FAQ
问1:如果一个解决方案包含多个项目,我修改了其中一个项目,其他的项目的版本号会递增吗?
答:设置好了就不会。(如何设置好请看问2)
问2:我的解决方案里只有一个项目,第一次编译后,我没有修改它,再按F6编译,此时版本号会递增吗?
答:会。但这不合逻辑,因为你没有修改项目,不应该重新编译,不应该启动IncBuildNo来递增版本号。但是如果不使用IncBuildNo,VS却不会重新编译。
原因在于IncBuildNo修改了AssemblyInfo.cs,后者是项目的一部分。所以,你可以把AssemblyInfo.cs排除在项目之外。这样,IncBuildNo仍然会递增AssemblyInfo.cs里的版本号,重复编译也不会重复递增了。
当你要发布发行版时,可以把AssemblyInfo.cs包括进项目,清除后期生成事件命令行,这样就把版本号编译进程序集里了。
问3:按照问2的回答,每次发布发行版都要清除后期生成事件命令行,太麻烦了,能不能简单点?
答:IncBuildNo有两个参数用来指定递增条件。你可以设置为DEBUG编译时递增,而RELEASE编译时不递增。详情见文档。
已知问题
- 此问题不是本程序的问题,而是采用FAQ问2的做法产生的问题:当你在VS2010里新建WPF自定义控件(CustomControl),VS会提示你“值不在预期的范围内”,但CustomControl1.cs却创建好了。如果你继续工作,运行后会发现CustomControl1没有应用上模板,显示的是空白一片。这是因为没有将AssemblyInfo.cs包括在项目内的缘故。更重要的是,没有
- [assembly: ThemeInfo(
- ResourceDictionaryLocation.None, //主题特定资源词典所处位置
- //(在页面或应用程序资源词典中
- // 未找到某个资源的情况下使用)
- ResourceDictionaryLocation.SourceAssembly //常规资源词典所处位置
- //(在页面、应用程序或任何主题特定资源词典中
- // 未找到某个资源的情况下使用)
- )]
[assembly: ThemeInfo(
ResourceDictionaryLocation.None, //主题特定资源词典所处位置
//(在页面或应用程序资源词典中
// 未找到某个资源的情况下使用)
ResourceDictionaryLocation.SourceAssembly //常规资源词典所处位置
//(在页面、应用程序或任何主题特定资源词典中
// 未找到某个资源的情况下使用)
)]
。(你应该能在项目外的AssemblyInfo.cs中找到它。)没有这句话,所以CustomControl1不正常。如果你不想把AssemblyInfo.cs再包括进来,引起FAQ问2的情况,可以把上述代码复制到任何一个命名空间上面。如
- using System;
- using System.Windows;
- [assembly: ThemeInfo(
- ResourceDictionaryLocation.None, //主题特定资源词典所处位置
- //(在页面或应用程序资源词典中
- // 未找到某个资源的情况下使用)
- ResourceDictionaryLocation.SourceAssembly //常规资源词典所处位置
- //(在页面、应用程序或任何主题特定资源词典中
- // 未找到某个资源的情况下使用)
- )]
- namespace SgsInterface
- {
- class Program
- {
- [STAThread]
- public static void Main(string[] args)
- {
using System;
using System.Windows;
[assembly: ThemeInfo(
ResourceDictionaryLocation.None, //主题特定资源词典所处位置
//(在页面或应用程序资源词典中
// 未找到某个资源的情况下使用)
ResourceDictionaryLocation.SourceAssembly //常规资源词典所处位置
//(在页面、应用程序或任何主题特定资源词典中
// 未找到某个资源的情况下使用)
)]
namespace SgsInterface
{
class Program
{
[STAThread]
public static void Main(string[] args)
{
转自:
http://blog.csdn.net/gqqnb/article/details/7213611