A: 

It might be I am missing something but I will try to answer:

1 I assume you mean the URL? Yes you can when creating the client object

var service = new Acmeco.AcmecoService();
service.Url = "oneUrlOrTheOther;

2 What do you mean? When you add the reference you have to give it a name which puts it in a unique namespace. Like Acmeco in the previous example.

3 That kind of depends on what in that 5% difference you mention? I don't quite understand how you end up with a difference in the WSDL for the same webservice on two different hosts. I would think only the addresses would be different but the methods and parameters would stay the same. Perhaps you can ellaborate?

olle
@olle: 1. No, I mean the WSDL 2. I mean the 'using' clause. Suppose I have 2 web references a and b, if I put using a; and using b; in the same file, I won't be able to compile it. Is there a way to have one of them reside in a different namespace, so when I add it to the file, it won't clash with the other? 3. There are many different API versions, additional custom objects and additional properties in the production site's WSDL (no doubt due to configurations by our SF admin) that do not exist in the sandbox's one. Thanks for your help!
Traveling Tech Guy
1. How do you mean the WSDL? The WSDL is used when you add the reference to generate the proxy classes and not during runtime.2 They do reside in different namespaces but once you add the using statement for both namespaces they will clash. I don't see how adding a namespace would resolve this. Instead of using the using statements use the fully qualified type names. Like YourServiceA.User instead of User.
olle
I think you need to rethink what you are trying to do. Either the services (or the parts you want to use) are compatible in methods and parameters and it's as simple as adding the reference once and just changing the URL. Or they arn't and there is no way arround writing code for each since they are different.
olle
SalesForce.com generates the WSDL based on the customizations made to the site. If the sandbox site is customized differently from the production site, then the actual WSDL will be different. There will be different XML schema for the Contacts type, for instance. One may even add data types, in which case there will be new schema and new operations.
John Saunders
A: 

What are the differences between them? I suspect it's just aht SalesForce.com is very customizable, so that your sandbox and production sites are not identical. The two need to be identical if you're going to take advantage of the ability to use the sandbox site for testing.

John Saunders
You are correct - someone put a lot of time in configuring the prod site, but never bothered to update the sandbox one - hence the differences.
Traveling Tech Guy
A: 

Actually, the solution was much easier and was hiding under my nose.
I just needed to use Namespace aliases. That way, I can include both services in compile time, and decide which to use at runtime:

using System.Web;
.
using ProductionAPI = MyCompany.SForce;
using SandboxAPI = MyCompany.SForce.Sandbox;
.
.
.
if(isSandbox)
  binding = new SandboxAPI.SForceService();
else
  binding = new ProductionAPI.SForceService();
.
.
.
Traveling Tech Guy