Имам запитване относно .Net Remoting, създаване на версии и създаване на активирани от клиента обекти.
Ето сценария:
Има 2 интерфейса, които се намират в собствена сборка „SharedTypes“: IServer и IAccount. IServer съдържа методи „GetStatus“, който връща низ, и „CreateAccount“, който връща тип IAccount. Това е регистрирано в GAC като v1.0.0.0.
Сървърното приложение препраща към SharedTypes и имплементира IServer и IAccount с конкретни класове, сървър и акаунт. Това са обекти MarshalByRefObject. Приложението Server маршалира класа Server като единичен обект.
Клиентското приложение препраща към SharedTypes и успешно се свързва с отдалечения обект на сървъра чрез интерфейса на 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 (чрез единичен обект). Ако обаче извикам 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 ще доведе до същото изключение?