From this description what you've done should work. However, you haven't really shown enough of the code or slice definitions to try and isolate the cause of the problem. Your C++ & C# code looks pretty strange also:
Code:
string identity = "";
TsrQueryDistributorImpl distributor = new TsrQueryDistributorImpl();
adapter.addFacet((IceObject) distributor, communicator().stringToIdentity(identity), ""); //default
adapter.addFacet((IceObject) distributor, communicator().stringToIdentity(identity), "v2");
I assume the identity is really not the empty string. Why the cast when adding the servant?
Code:
// create the proxy to the server
Ice::ObjectPrx base = (*((Ice::CommunicatorPtr*)(_pDistributorProxy->GetIceCommunicator())))->
stringToProxy(_connectionString);
Why all the casting?
Code:
_pQueryProxy = new Slice::ITsrQueryDistributorPrx();
*(_pQueryProxy) = Slice::ITsrQueryDistributorPrx::uncheckedCast(base );
This is never necessary... proxies are created by the Ice runtime, not by your code in this manner. This code should be:
Code:
_pQueryProxy = Slice::ITsrQueryDistributorPrx::uncheckedCast(base );
What do you do with the proxy once you've narrowed it? Are you sure you didn't accidently change a V1 interface?
With all of the casting and unnecessary memory management I wouldn't be surprised if your C++ code has some nasty problem lurking.