Click here to Skip to main content
15,867,704 members
Articles / Programming Languages / C# 4.0

Autoincrement Version in Visual Studio

Rate me:
Please Sign up or sign in to vote.
4.60/5 (13 votes)
12 May 2010CPOL 68.5K   814   56   22
Autoincrement version in Visual Studio

Introduction

This is a small application with source code provided. It helps organize version auto increment in C# projects.

Using the Code

Usage:

vbinc -[af1234]|[-c]|[-h]

Options:

  • a Increment assembly version
  • f Increment file version
  • 1 Increment +1.x.x.x (Increments major version)
  • 2 Increment x.+1.x.x (Increments minor version)
  • 3 Increment x.x.+1.x (Increments build)
  • 4 Increment x.x.x.+1 (Increments revision)
  • c Just show current version
  • h this help screen.

Example:

vbinc -af34

Increments assembly and file build and revision numbers.

C# has version format like [major version].[minor].[build].[revision]

Installation:
  • Put vbinc.exe to the root of solution
  • Put lines
if  $(ConfigurationName) == Debug $(ProjectDir)vbinc.exe -af4
if  $(ConfigurationName) == Release $(ProjectDir)vbinc.exe -af34

or if your path contains a space character, try enclosing the $(ProjectDir) in quotes

if  $(ConfigurationName) == Debug "$(ProjectDir)"vbinc.exe -af4
if  $(ConfigurationName) == Release "$(ProjectDir)"vbinc.exe -af34

to Pre-Build event command line of each project.

From now, every Debug build will increment [revision] of assembly and file before build of project.

And every Release build will increment [build] and [revision] of assembly and file.

C#
using System;
using System.Diagnostics;
using System.IO;
using System.Text.RegularExpressions;

namespace vbinc
{
    class Program
    {
        private static int _incMajor = 0;
        private static int _incMinor = 0;
        private static int _incRevno = 0;
        private static int _incBuild = 0;

        private static bool _bshow;
        private static bool _bassemply;
        private static bool _bfile;

        private const string Pattern1 = 
                    @"\[assembly\: AssemblyVersion\
			(""(\d{1,})\.(\d{1,})\.(\d{1,})\.(\d{1,})""\)\]";
        private const string Pattern2 =
                    @"\[assembly\: AssemblyFileVersion\
			(""(\d{1,})\.(\d{1,})\.(\d{1,})\.(\d{1,})""\)\]";

        private const string VersionFile = @"..\..\Properties\AssemblyInfo.cs";
        private const string BackupFile = @"..\..\Properties\AssemblyInfo.~cs";

        static void Main(string[] args)
        {
            try
            {
                if(!ParseCmdLine(args))
                {
                    ShowUsage();
                    return;
                };

                string str = File.ReadAllText(VersionFile);
                string result;                

                if (_bassemply || _bshow) result = GetResult
			(Pattern1, str, "AssemblyVersion");
                else result = str;
                if (_bfile || _bshow) result = GetResult
			(Pattern2, result, "AssemblyFileVersion");

                if (!_bshow)
                {
                    File.Delete(BackupFile);
                    File.Copy(VersionFile, BackupFile);
                    File.WriteAllText(VersionFile, result);
                }
                forDebug();
            }
            catch (Exception ex)
            {
                Console.WriteLine("ERR: " + ex.Message);
            }
        }

        [Conditional("DEBUG")]
        private static void forDebug()
        {
            Console.ReadKey();
        }

        public static bool ParseCmdLine(string[] args)
        {
            if (args.Length == 0) return false;
            string astr;

            foreach (string arg in args)
            {
                if(arg.StartsWith("-"))
                {
                    astr = arg.ToLower();
                    if (astr.Contains("a")) _bassemply = true;
                    if (astr.Contains("f")) _bfile = true;
                    if (astr.Contains("1")) _incMajor = 1;
                    if (astr.Contains("2")) _incMinor = 1;
                    if (astr.Contains("3")) _incBuild = 1;
                    if (astr.Contains("4")) _incRevno = 1;
                    if (astr.Contains("c")) _bshow = true;
                }

                if (arg.ToLower().StartsWith("-h")) return false;

                if (_bshow)
                {
                    _incMajor = 0;
                    _incMinor = 0;
                    _incBuild = 0;
                    _incRevno = 0;
                }
            }
            return true;
        }

        public static void ShowUsage()
        {
            Console.WriteLine("vbinc v{0}", 
		Process.GetCurrentProcess().MainModule.FileVersionInfo.FileVersion);

            Console.WriteLine("Autoincrement version in c# projects. by vdasus.com");
            Console.WriteLine("");
            Console.WriteLine("usage: vbinc -[af1234]|[-c]|[-h]");
            Console.WriteLine("Options");
            Console.WriteLine("\t-a Increment assembly version");
            Console.WriteLine("\t-f Increment file version");
            Console.WriteLine("\t-1 Increment +1.x.x.x");
            Console.WriteLine("\t-2 Increment x.+1.x.x");
            Console.WriteLine("\t-3 Increment x.x.+1.x");
            Console.WriteLine("\t-4 Increment x.x.x.+1");
            Console.WriteLine("\t-c Just show current version");
            Console.WriteLine("\t-h this help screen.");
            Console.WriteLine("");
            Console.WriteLine("Example: vbinc -af34");
            Console.WriteLine("Increments assembly and file build and revision numbers.");

            Console.WriteLine("");

            Environment.Exit(0);
        }

        private static string GetResult(string pattern, string str, string app)
        {
            Regex r = new Regex(pattern);
            Match m = r.Match(str);

            string rz = string.Format("[assembly: {4}(\"{0}.{1}.{2}.{3}\")]"
                , GetInc(m.Groups[1].Value, _incMajor)
                , GetInc(m.Groups[2].Value, _incMinor)
                , GetInc(m.Groups[3].Value, _incBuild)
                , GetInc(m.Groups[4].Value, _incRevno)
                , app);

            Console.WriteLine(rz);

            return r.Replace(str, rz);
        }

        private static int GetInc(string aVer, int adoInc)
        {
            return Convert.ToInt32(aVer) + adoInc;
        }
    }
}  

History

  • 12th May, 2010: Initial post

License

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


Written By
Lithuania Lithuania
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
QuestionNo visible action taken Pin
barriesargent23-May-14 6:41
barriesargent23-May-14 6:41 
SuggestionPre-build Pin
kptkachenko6-Feb-14 19:41
kptkachenko6-Feb-14 19:41 
GeneralMy vote of 4 Pin
Ali Taghvajou19-Jan-13 19:04
professionalAli Taghvajou19-Jan-13 19:04 
GeneralRe: My vote of 4 Pin
Andy Neillans3-Jan-14 21:01
professionalAndy Neillans3-Jan-14 21:01 
QuestionError.. Pin
EveryNameIsTakenEvenThisOne2-Aug-11 13:47
professionalEveryNameIsTakenEvenThisOne2-Aug-11 13:47 
AnswerRe: Error.. Pin
vdasus2-Aug-11 23:11
vdasus2-Aug-11 23:11 
AnswerRe: Error.. Pin
Joe Pizzi20-Sep-11 16:43
Joe Pizzi20-Sep-11 16:43 
GeneralRe: Error.. Pin
vdasus20-Sep-11 21:14
vdasus20-Sep-11 21:14 
GeneralCant have it working... Pin
henur22-Oct-10 21:45
henur22-Oct-10 21:45 
GeneralRe: Cant have it working... Pin
vdasus25-Oct-10 7:14
vdasus25-Oct-10 7:14 
GeneralNice work Pin
Donsw5-Jun-10 16:23
Donsw5-Jun-10 16:23 
Generalnew version releaseed :) Pin
vdasus26-May-10 0:54
vdasus26-May-10 0:54 
GeneralRe: new version releaseed :) Pin
Robin1-Jun-10 7:59
Robin1-Jun-10 7:59 
GeneralRe: new version releaseed :) Pin
vdasus1-Jun-10 8:31
vdasus1-Jun-10 8:31 
GeneralHas anyone tried this on a C++/CLI or C++/MFC Project Pin
MicroImaging13-May-10 4:26
MicroImaging13-May-10 4:26 
GeneralRe: Has anyone tried this on a C++/CLI or C++/MFC Project Pin
vdasus13-May-10 5:24
vdasus13-May-10 5:24 
GeneralRe: Has anyone tried this on a C++/CLI or C++/MFC Project Pin
vdasus26-May-10 0:56
vdasus26-May-10 0:56 
GeneralLooks interesting Pin
supercat912-May-10 11:47
supercat912-May-10 11:47 
For my own projects using a cross-compiler, I have a conceptually-similar but different utility which generates an "autover.h" file which defines things like build date, time, year, month, day, hour, and minute along with a revision. Many items are included in both string and numeric form (unfortunately, because of the brilliant way C denotes octal numbers, I can't simply #define BUILD_MIN 08 and then string-ize BUILD_MIN if I want it in string form). Adapting that utility for VS projects would be nice. Any idea if this approach would be adaptable to vbEx2005?
GeneralRe: Looks interesting Pin
vdasus12-May-10 21:33
vdasus12-May-10 21:33 
GeneralRe: Looks interesting Pin
supercat913-May-10 5:15
supercat913-May-10 5:15 
GeneralRe: Looks interesting Pin
vdasus13-May-10 5:22
vdasus13-May-10 5:22 
GeneralRe: Looks interesting Pin
vdasus26-May-10 0:52
vdasus26-May-10 0:52 

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

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