Solution 1 is a really excellent answer. Indeed, this is the one of least known features, rarely used, really hard to discover, really can be used to resolve referencing near identical assemblies.
But should it be used to resolve different versions of same assemblies, to use both at the same time? Yes, this is possible, but can only be considered as a last resort. If both versions belong to the development teams, or source codes can be obtained somehow, it would be the best to merge them in one, but usually, there is no a need in that. In nearly all cases, it is already done in the latest version, so a need for using a legacy version, too, would be just mythical. All it takes should be done to migrate to only one version.
Supporting code using two or more options at a time may seem a solution, but even with deficit of development time it cannot be a viable solution, because it post-pones the problem only for short period of time, to make thing a lot worse. Please rethink it all, don't create yourself a big problem.
[EDIT]
Now, the detail from original MSDN source:
http://msdn.microsoft.com/en-us/library/ms173212.aspx[
^].
This documentation fails to explain all the syntax detail. First of all, this declaration is required to be on top of all the
uses
clauses.
See also:
http://www.dotnetperls.com/extern[
^].
—SA