VS.net set version for multiple projects in one solution
-
21-09-2019 - |
Question
I am trying to update a lot of different projects in a solution to have a new version number. Is there a simple way to synchronize the version number across all projects fileversion and clickonce options?
Answer
Finally solved the problem by writing a little tool:
Sub Main()
Try
Console.WriteLine("Updating version numbers")
Dim strPath As String = System.AppDomain.CurrentDomain.BaseDirectory()
Dim strAppName As String = ""
Console.WriteLine(strPath)
If My.Application.CommandLineArgs.Count > 0 Then
Console.WriteLine(My.Application.CommandLineArgs(0))
strPath = My.Application.CommandLineArgs(0)
strAppName = My.Application.CommandLineArgs(1)
Else
strPath = "C:\Projects\APP\"
Console.WriteLine("Error loading settings")
End If
Dim strAssemblyInfoFile As String = strPath + "Properties\AssemblyInfo.cs"
If Not File.Exists(strAssemblyInfoFile) Then
strAssemblyInfoFile = strPath + "My Project\AssemblyInfo.vb"
End If
Console.WriteLine("Loading " + strAssemblyInfoFile)
Dim strFileContent As String
strFileContent = ReadFileText(strAssemblyInfoFile)
Dim AssemblyVersionRegex As New Regex("AssemblyVersion(?:Attribute)?\(\s*?""(?<version>(?<major>[0-9]+)\.(?<minor>[0-9]+)\.(?<build>[0-9]+)\.(?<revision>[0-9]+))""\s*?\)")
Dim strOldVersion As String = AssemblyVersionRegex.Match(strFileContent).Groups("version").Value
Dim oldVersion As New Version(strOldVersion)
Dim newVersion As New Version(oldVersion.Major.ToString + "." + oldVersion.Minor.ToString + "." + oldVersion.MajorRevision.ToString + "." + (oldVersion.MinorRevision + 1).ToString)
Dim strNewVersion As String = newVersion.ToString()
Console.WriteLine("Newversion " + strNewVersion)
'Replace oldversion to newversion
strFileContent = strFileContent.Replace(strOldVersion, strNewVersion)
File.WriteAllText(strAssemblyInfoFile, strFileContent)
Dim strProjectFile As String = strPath + strAppName + ".csproj"
If Not File.Exists(strProjectFile) Then
strProjectFile = strPath + strAppName + ".vbproj"
End If
Console.WriteLine("Loading " + strProjectFile)
strFileContent = File.ReadAllText(strProjectFile)
strFileContent = strFileContent.Replace(strOldVersion, strNewVersion)
Dim strOld As String = "<ApplicationRevision>" + oldVersion.MinorRevision.ToString() + "</ApplicationRevision>"
Dim strNew As String = "<ApplicationRevision>" + (oldVersion.MinorRevision + 1).ToString() + "</ApplicationRevision>"
strFileContent = strFileContent.Replace(strOld, strNew)
SaveFile(strProjectFile, strFileContent)
Console.WriteLine("Done")
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
End Sub
Function ReadFileText(ByVal strFilePath As String) As String
Return File.ReadAllText(strFilePath)
End Function
Sub SaveFile(ByVal strFilePath As String, ByVal strData As String)
File.WriteAllText(strFilePath, strData)
End Sub
Solution
I typically store the assembly version attributes in a separate AssemblyVersion.cs file and place it at the root folder of my solution.
Then I link the file to each project:
- Context-menu on Project and choose "Add Existing Item"
- Select the file from the root folder
- Click on the Drop-down menu next to the "Add" button" and select "Add as Link"
Unfortunately, I haven't found a clean way in MSBuild to auto-generate the version number before the solution compiles. (I believe MSBuild only has events per project, not per solution -- maybe someone else out there knows update: see here for solution-wide pre-build events through msbuild)
Instead, I use nant to compile the solution and use the asminfo task to generate the AssemblyVersion.cs file.