Auto Increment Build Numbers for C# Projects in VS.NET 2003

Ok... I was really sick of incrementing the build number, each time that I built my project. Also, I know that I could use the NAnt task to increment build numbers, but this project does not have NAnt configuration files, and I don’t feel like writing them just to increment the build number. Since no one else has apparently created one of these for Visual Studio .NET C# projects, I hacked together this macro to do it autonomously. It basically opens up all projects in the solution (you can change this to only the active projects) and tries to open the corresponding AssemblyInfo.cs file in each project. You can specify which field you would like to increment, also. To install, do the following:

  1. Tools->Macros->New Macro Project
  2. Call it whatever you want. Example BuildMacros
  3. Alt-F11 (Opens up the Macros IDE)
  4. Copy and paste the macro code below, in the Module1 code.
  5. Rename Module1 macro to BuildIncrementer
  6. Open up EnvironmentEvents macro under BuildMacros (Or whatever you named your macro project)
  7. Add the following under the Automatically generated code region in the EnvironmentEvents macro


Private Sub BuildEvents_OnBuildDone(ByVal Scope As EnvDTE.vsBuildScope, ByVal Action As EnvDTE.vsBuildAction) Handles BuildEvents.OnBuildDone

    IncrementBuildNumber()

End Sub

This is the macro:


 

Option Strict Off
Option Explicit Off
 
Imports EnvDTE
Imports
System.Diagnostics

Public Module BuildIncrementer
    ' From http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/Q237/8/70.ASP&NoWebContent=1
    Function GetProjectDir(ByVal FullName)

    Dim proj_path proj_path = Split(StrReverse(FullName), "\", -1, 1)
    Dim count
    count = UBound(proj_path)
    Dim full_path full_path = ""

    Dim i
    For i = 1 To count

      full_path = full_path & "\" & proj_path(i)
    Next

    GetProjectDir = StrReverse(full_path)

    End Function

    ' objSel- Represents the TextSelection object highlighting the version string to increment
    ' count- Represents the position, in the version string, to be incremented
    ' incrementBy- Represents a number to increment the version number by

    Sub ReplaceText(ByVal objSel As TextSelection, ByVal count As Integer, ByVal incrementBy As Integer)

      Dim strTemp As String() = Nothing
      Dim strTemp2 As String = ""
      Dim i As Integer = 0

      strTemp = objSel.Text.Split(".")
      Dim s As String
      For i = 1 To strTemp.Length - 1
        If i = count Then
          Dim oldValue As Integer = strTemp.GetValue(i)
          Dim newValue As Integer
          newValue = oldValue + incrementBy
          Dim strNewValue As String = newValue
          strTemp.SetValue(strNewValue, i)
          Exit For
        End If
      Next i

      objSel.Text = Join(strTemp, ".")
    End Sub

    ' This event will be triggered after every build of a project
    ' You can modify the code below to only update projects that are active
    ' It currently will scan all projects in the solution for AssemblyInfo.cs files
    ' to update.

    Sub IncrementBuildNumber() 

      'Comment the follow 3 lines, if you want the build number to increment even if the build fails
      If DTE.Solution.SolutionBuild.LastBuildInfo() <> 0 Then
        Exit Sub
      End If

      ' Change this, if you would only like to modify the AssemblyInfo file in active project files
      ' For Each proj As Project In DTE.ActiveSolutionProjects

      For Each proj As Project In DTE.Solution.Projects
        Dim full_path
        full_path = GetProjectDir(proj.FullName)
        ' Attempt to open the AssemblyInfo.cs file
        full_path = full_path & "AssemblyInfo.cs"

        Try
          DTE.ItemOperations.OpenFile(full_path).Activate()
          Dim activeDoc As Document = DTE.ActiveDocument
          Dim objSelection As TextSelection
          objSelection = DTE.ActiveDocument.Selection
          Dim objStartPosition As Integer

          ' Get the text between AssemblyVersion(" and ")
          objSelection.FindText("AssemblyVersion(""")
          objStartPosition = objSelection.BottomPoint.DisplayColumn
          Dim objEndPosition As Integer
          objSelection.FindText(""")]")
          objEndPosition = objSelection.AnchorPoint.DisplayColumn

          ' Get back to after the AssemblyVersion" part
          objSelection.StartOfLine()
          objSelection.FindText("AssemblyVersion(""")
          objSelection.Collapse()
          objSelection.MoveToDisplayColumn(0, objEndPosition, True)
          ReplaceText(objSelection, 3, 1)
          activeDoc.Close(vsSaveChanges.vsSaveChangesYes)
        Catch

        End Try
      Next
    End Sub

End Module

Kick it! Del.icio.us  Digg It!  StumbleUpon  Reddit  NewsVine  Furl  BlinkList  Ma.gnolia  Technorati

Comments