У меня есть вопрос о .Net Remoting, управлении версиями и создании активированных клиентом объектов.
Вот сценарий:
Есть 2 интерфейса, находящихся в их собственной сборке «SharedTypes»: IServer и IAccount. IServer содержит методы «GetStatus», который возвращает строку, и «CreateAccount», который возвращает тип IAccount. Это зарегистрировано в GAC как v1.0.0.0.
Приложение сервера ссылается на SharedTypes и реализует IServer и IAccount с конкретными классами, сервером и учетной записью. Это объекты MarshalByRefObject. Приложение Server маршализирует класс Server как одноэлементный объект.
Клиентское приложение ссылается на SharedTypes и успешно подключается к удаленному объекту Server через интерфейс IServer. Здесь я могу успешно вызвать GetStatus и CreateAccount (который возвращает активированный клиентом объект). Пока все в порядке.
Теперь я увеличиваю версию SharedTypes до v2.0.0.0 и регистрируюсь в GAC, удаляя старую версию v1.0.0.0.
Приложение сервера построено для этой версии, а клиент - нет.
Теперь, когда я запускаю клиентское приложение, оно, как и ожидалось, будет жаловаться на System.IO.FileNotFoundException, т. Е. Ему не удалось найти v1.0.0.0 SharedTypes в GAC.
Если я скопирую v1.0.0.0 SharedTypes в каталог exe клиента, клиентское приложение в конечном итоге будет привязано к этому (после того, как поиск в GAC оказался неудачным). Клиентское приложение запускается, и я могу успешно вызвать GetStatus для объекта IServer (через объект singleton). Однако, если я вызываю CreateAccount, который должен возвращать активированный клиентом объект, я получаю следующее исключение:
System.InvalidCastException: Return argument has an invalid type.
at System.Runtime.Remoting.Proxies.RealProxy.ValidateReturnArg(Object arg, Type paramType)
at System.Runtime.Remoting.Proxies.RealProxy.PropagateOutParameters(IMessage msg, Object[] outArgs, Object returnValue)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at SharedTypes.IServer.GetAccount()
Мой вопрос заключается в том, почему вызов GetStatus на активированном на сервере одноэлементном объекте с клиента (который использует v1.0.0.0) не вызывает это исключение, в то время как создание активированного клиентом объекта через CreateAccount делает это? Поскольку оба типа создаются на сервере, я бы подумал, что вызов GetStatus приведет к тому же исключению?