What we do here is just keep constantly updating and improving our common library and then when we get to a point that we're comfortable with it and it needs to be used in an application, we up the major or minor version depending on the number of changes, build an installer for it, and label it in source control.
We handle old applications by simply upgrading them to the latest version when we need to make changes to that application.
I build an SDK and Redistributable installer for the common library. The SDK goes to all the developers and includes source code, templates, documentation, puts the DLLs on their drive, and also puts the DLLs in their GAC. The Redistributable simply puts the DLLs in the GAC. We install the redistributable on the servers.
We are soon going to go to a method where we don't produce a redistributable. We will only produce an SDK, and in that SDK will be a merge module for the common library. When a developer uses the library and is ready to move their app to production, they will build an installer for it and include the merge module in that installer, that way the deployment for the application always has the right version of the common library and we don't have to worry about installing it on the servers first.
I don't know anything about your environment, so I don't know how these techniques would work for you, but it's working pretty well for us right now.