Earlier I wrote about the issues with versioning assemblies when you decide to Strong Name your assemblies. While those pains are for real, I came across some additional patterns which can ease that pain considerably. Example1, Example2, Example3
Essentially, You want to do the following as much as your management team allows you to do that (yeah, its true that sometimes they decide the version numbers :D):
1. Change the AssemblyVersion value during internal builds every time so that your internal test team does not use an older version even by mistake. This works fine if you are working on an application which needs to go through future iterations as well. Once one of the versions is signed off by test team, that particular version becomes the de-facto support version and from thereon, you depend on AssemblyFileVersion for updates/patches. This will ensure that a new assembly does not break hell.
2. If any of your changes are going to necessitate significant changes, push it to next iteration :). Since the changes are significant, it is better to have a new version associated with those changes than to have one version reflect significant differences across its file versions. It may not be possible to avoid every time though but then I guess you are not in luck.
3. Use AssemblyInformationalVersion to tag the metadata information that you want to use for conversations. e.g. "1.0.-Iteration1".
For example, I can have following in my assembly.
[assembly: AssemblyVersion("1.3.6.1")]
[assembly: AssemblyFileVersion("1.3.2015.12121")]
[assembly: AssemblyInformationalVersion("1.3 iteration3")]
[assembly: AssemblyFileVersion("1.3.2015.12121")]
[assembly: AssemblyInformationalVersion("1.3 iteration3")]
Notice that I have used a custom naming pattern in AssemblyFileVersion. It uses Year, Month, Day, Build count. You can use your own e.g. attaching changeset number.
Lastly, the sad part is that "*" is NOT supported in AssemblyFileVersion.