I will not go into the details of why should assemblies be versioned as the advantage are obvious, however this post will outline the no-nonsense way to implement versioning in your assemblies today:
Prerequisites:
1. Before an assembly can be versioned, it has to be strong named.
How-to:
[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile("..\\..\\privatekeyFileName.snk")]
[assembly: AssemblyKeyName("")]
[assembly: AssemblyVersion("1.0.0.0")]
Post-build: Caution
1. A strong-named assembly may be installed in the global assembly cache as it is the only storage system currently which support version-aware storage. If you try to copy a new version assembly into a folder where an older version exists, you will have to overwrite the old file as normal windows folders do not support versioning.
When u reference an assembly, during runtime the following process takes place to locate the assembly:
Once the version has been determined, the assembly is searched in the following locations:
[application base] / [culture] / [assembly name].dll
[application base] / [culture] / [assembly name] / [assembly name].dll
[application base] / [assembly name].dll
[application base] / [assembly name] / [assembly name].dll
[application base] / [binpath] / [culture] / [assembly name].dll
[application base] / [binpath] / [culture] / [assembly name] / [assembly name].dll
[application base] / [binpath] / [assembly name].dll
[application base] / [binpath] / [assembly name] / [assembly name].dll