Click here to Skip to main content
Licence CPOL
First Posted 25 Nov 2008
Views 65,581
Downloads 814
Bookmarked 96 times

How To Update Assembly Version Number Automatically

By | 28 Jan 2009 | Article
A small utility which allows to modify AssemblyVersion attribute specified in AssemblyInfo.cs files
 
Part of The SQL Zone sponsored by
See Also

The Problem

I suppose I am not the only one who does not like the version numbers automatically generated by Visual Studio when you specify something like the following in your AssemblyInfo.cs file:

[assembly: AssemblyVersion("2.7.*.*")] 

In the other hand, I would like to specify those numbers automatically during the build process. Moreover it would be great to have an ability to change the whole version number or just increase the latest part of it (build number).  

Of course, you may say that such an operation can simply be done manually. It is true for one or two assemblies. But our usual project contains about 10-15 different assemblies and we would like to have a version number in all of them synchronized.

The Solution

So we need some utility which will perform all the described tasks automatically and which we can call from our build script. The presented simple program allows to change the whole version number in AssemblyInfo files or just increase the number of the build.

To use this program, just call AssemblyInfoUtil.exe with two parameters. The first parameter is the path to AssemblyInfo.cs file that you would like to modify. The second parameter tells the program how to modify the version number attribute. It can be one of the following options:

-set:<New Version Number>

Set the version number to the specified one.

-inc:<Parameter Index>

Simply increase the number of one parameter in version string by 1. Here "Parameter Index" can be any number from 1 to 4. For 1 - the major version number will be increased, for 2 - the minor one and so on.

Examples

AssemblyInfoUtil.exe -set:3.1.7.53 "C:\Program Files\MyProject1\AssemblyInfo.cs"

Set the version string to "3.1.7.53".

AssemblyInfoUtil.exe -inc:4 AssemblyInfo.cs

Increase the last (revision) number. So in our case it will become 54.

The Code

So here is the code of this utility. I have published only the content of the Main.cs file. Other project files (like *.csprj) can be found in the attached archive.

using System;
using System.IO;
using System.Text;

namespace AssemblyInfoUtil
{
    /// <summary>
    /// Summary description for Class1.
    /// </summary>
    class AssemblyInfoUtil
    {
	private static int incParamNum = 0;

	private static string fileName = "";
	
	private static string versionStr = null;

	private static bool isVB = false;

	/// <summary>
	/// The main entry point for the application.
	/// </summary>
	[STAThread]
	static void Main(string[] args)
	{
	    for (int i = 0; i < args.Length; i++) {
	        if (args[i].StartsWith("-inc:")) {
		   string s = args[i].Substring("-inc:".Length);
		   incParamNum = int.Parse(s);
	        }
	        else if (args[i].StartsWith("-set:")) {
		   versionStr = args[i].Substring("-set:".Length);
	        }
	        else
		   fileName = args[i];
	    }

	    if (Path.GetExtension(fileName).ToLower() == ".vb")
		isVB = true;

	    if (fileName == "") {
		System.Console.WriteLine("Usage: AssemblyInfoUtil 
		    <path to AssemblyInfo.cs or AssemblyInfo.vb file> [options]");
		System.Console.WriteLine("Options: ");
		System.Console.WriteLine("  -set:<new version number> - 
				set new version number (in NN.NN.NN.NN format)");
		System.Console.WriteLine("  -inc:<parameter index>  - 
		   increases the parameter with specified index (can be from 1 to 4)");
		return;
	    }

	    if (!File.Exists(fileName)) {
		System.Console.WriteLine
			("Error: Can not find file \"" + fileName + "\"");
		return;
	    }

	    System.Console.Write("Processing \"" + fileName + "\"...");
	    StreamReader reader = new StreamReader(fileName);
             StreamWriter writer = new StreamWriter(fileName + ".out");
	    String line;

	    while ((line = reader.ReadLine()) != null) {
		line = ProcessLine(line);
		writer.WriteLine(line);
	    }
	    reader.Close();
	    writer.Close();

	    File.Delete(fileName);
	    File.Move(fileName + ".out", fileName);
	    System.Console.WriteLine("Done!");
	}

	private static string ProcessLine(string line) {
	    if (isVB) {
		line = ProcessLinePart(line, "<Assembly: AssemblyVersion(\"");
		line = ProcessLinePart(line, "<Assembly: AssemblyFileVersion(\"");
	    } 
	    else {
		line = ProcessLinePart(line, "[assembly: AssemblyVersion(\"");
		line = ProcessLinePart(line, "[assembly: AssemblyFileVersion(\"");
	    }
	    return line;
	}

	private static string ProcessLinePart(string line, string part) {
	    int spos = line.IndexOf(part);
	    if (spos >= 0) {
		spos += part.Length;
		int epos = line.IndexOf('"', spos);
		string oldVersion = line.Substring(spos, epos - spos);
		string newVersion = "";
		bool performChange = false;

		if (incParamNum > 0) {
	  	    string[] nums = oldVersion.Split('.');
		    if (nums.Length >= incParamNum && nums[incParamNum - 1] != "*") {
			Int64 val = Int64.Parse(nums[incParamNum - 1]);
			val++;
			nums[incParamNum - 1] = val.ToString();
			newVersion = nums[0]; 
			for (int i = 1; i < nums.Length; i++) {
			    newVersion += "." + nums[i];
			}
			performChange = true;
		    }
		}
		
		else if (versionStr != null) {
		    newVersion = versionStr;
		    performChange = true;
		}

		if (performChange) {
		    StringBuilder str = new StringBuilder(line);
		    str.Remove(spos, epos - spos);
		    str.Insert(spos, newVersion);
		    line = str.ToString();
		}
	    } 
	    return line;
	}
     }
}

History

  • 25th November, 2008: Initial post
  • 27th January, 2009: Article update

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Sergiy Korzh

Founder
Korzh.com
Ukraine Ukraine

Member

Software developer and architect, entrepreneur.
Main kind of activity and interest:
- software development and promotion (.NET and Delphi components mainly, see devtools.korzh.com for details);
- software engineering (extreme programming, design patterns, etc.);
- IT industry trends.
 
Main projects:
* EasyQuery - user-friendly ad-hoc reporting components for your application or web site;
* Localizer - localization tool kit for Delphi applications;

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
QuestionThank you for sharing Pinmembermikeperetz2:28 14 Mar '12  
SuggestionVersioning Controlled Build PinmemberTobiasP5:58 7 Mar '12  
AnswerThanks a lot PinmemberSudarsan Srinivasan0:39 13 Apr '11  
GeneralBig thanks man Pinmemberkfx66616:55 13 Mar '11  
GeneralMy vote of 5 Pinmemberlparkd5:33 4 Oct '10  
GeneralWorks great for me PinmemberMichael Elly12:52 10 Aug '10  
GeneralMy vote of 5 PinmemberMichael Elly12:49 10 Aug '10  
GeneralTry using regular expressions to parse Pinmembermekansm6:37 29 Jan '09  
GeneralSynchronize version number across assemblies PinmemberMarc Scheuner2:52 29 Jan '09  
GeneralRe: Synchronize version number across assemblies PinmemberDon DenUyl3:10 3 Feb '09  
GeneralNice article PinmemberJeffrey Cameron5:04 27 Jan '09  
GeneralRe: Nice article PinmemberSergiy Korzh20:41 27 Jan '09  
QuestionHow To Update Assembly Version Number Automatically PinmemberSergiuMD22:14 20 Jan '09  
GeneralGood article PinmemberDonsw10:34 8 Jan '09  
GeneralThe simple solution PinPopularmemberMike Lang9:20 26 Nov '08  
Just create a single SolutionInfo.cs file with the version attribute. Then 'link' that file into each project in the solution, and remove the version attribute from each projects AssemblyInfo.cs. Now you just have one file to update each build, and you have fine grained control over version.
 
My SolutionInfo.cs includes the AssemblyCompany, AssemblyCopyright, AssemblyTrademark, AssemblyVersion, and AssemblyFileVersion attributes. Sometimes I update the AssemblyFileVersion attribute and not the AssemblyVersion when I just fix a bug and want to issue a hotfix for clients.
 
Michael Lang
(versat1474)
http://www.xquisoft.com/[^]

GeneralAddition to the simple solution PinmemberUrs Enzler19:57 1 Dec '08  
GeneralSearch for similar articles PinmemberCam Birch5:56 26 Nov '08  
GeneralRe: Search for similar articles PinmemberSergiy Korzh23:53 26 Nov '08  
GeneralRe: Search for similar articles PinmemberPIEBALDconsult5:12 29 Jan '09  
GeneralRe: Search for similar articles PinmemberCDMTJX8:19 2 Dec '08  
GeneralMy vote of 5 PinmemberAbu Abdillah0:20 26 Nov '08  
GeneralMy vote of 2 Pinmember_FleX19:52 25 Nov '08  
GeneralRe: My vote of 2 PinmemberSergiy Korzh5:33 26 Nov '08  
GeneralRe: My vote of 2 PinPopularmemberalexdresko9:08 4 Dec '08  
GeneralRe: My vote of 2 PinmemberGriffinPeter23:42 27 Jan '09  

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Mobile
Web04 | 2.5.120604.1 | Last Updated 28 Jan 2009
Article Copyright 2008 by Sergiy Korzh
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid