Following on from your comment:
I have been experimenting, and it
appears that as long as I define the
same classes, and the DLL names stay
the same, physically changing the DLL
in the directory works fine. Do you
know of any problems with, or
downfalls of this approach?
The main problem/downfall of this approach is ensuring that you keep the classes/methods exposed by both DLLs in lock-step. Probably the best way to do this, given that you seem to have a model of:
PROGRAM -> REFERENCED DLL -> [One of two "Backend DLL's]
Would be to create abstract classes/interfaces in "REFERENCED DLL" that specify the classes/methods that both of the "Backend DLL'" should expose, then have both backend DLL's reference the "REFERENCED DLL" and implement actual classes on-top of the abstract classes/interfaces.
For example, "Program" expects to be able to use a class called "Logger" in REFERENCED.DLL, which uses methods in the clas called "BackEndLogger" in BACKEND.DLL (whether that be the development or production version). So, in REFERENCED.DLL have a class such as:
public abstract class BackEndLogger
{
public virtual void LogEvent(string eventToLog)
}
Then, in both versions of "BACKEND.DLL", have a class such as:
public class Logger : BackEndLogger
{
public override void LogEvent(string eventToLog)
{
... code for implementation goes here
}
}
REFERENCED.DLL will have a reference to a DLL called "BACKEND.DLL", and, because the classes interfaces are exactly the same (pretty much ensured by keeping them in synch by implementing the abstract classes/interfaces in REFERENCED.DLL) will be none the wiser.
Hopefully this made some sort of sense =)