![]() |
Languages »
C# »
CodeProject Utilities
Intermediate
License: The Code Project Open License (CPOL)
How To Update Assembly Version Number AutomaticallyBy Sergiy KorzhA small utility which allows to modify AssemblyVersion attribute specified in AssemblyInfo.cs files |
C#, .NET, ASP.NET, ADO.NET, WinForms, WebForms, Architect, Dev
|
|
Advanced Search Add to IE Search |
|
|
|
||||||||||||||||
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.
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.
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.
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;
}
}
}
General
News
Question
Answer
Joke
Rant
Admin
Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads.
|
PermaLink |
Privacy |
Terms of Use
Last Updated: 28 Jan 2009 Editor: Deeksha Shenoy |
Copyright 2008 by Sergiy Korzh Everything else Copyright © CodeProject, 1999-2010 Web19 | Advertise on the Code Project |