Положение:
У меня есть куча бизнес-объектов, сидящих за веб-сервисом. Все объекты инкапсулированы в BusObjects.DLL, который строго назван и находится в GAC на сервере (потому что другие приложения на сервере также обращаются к нему).
У меня есть клиентское приложение с однократным нажатием, которое вызывает указанный веб-сервис. Приложение с одним кликом также поставляется с этим BusObjects.DLL.
Веб-служба возвращает данные клиенту следующим образом: она сериализует бизнес-объект до байтового массива и возвращает этот байтовый массив клиенту. Клиент десериализует полученный байтовый массив обратно в бизнес-объект. Это возможно потому, что код клиента и сервера имеют ссылку на один и тот же BusObjects.DLL. Это все прекрасно работает.
Проблема для меня заключается в следующем. Когда у меня есть клиентское решение (которое включает проект BusObjects) в IDE VS2005, код не может десериализовать массив байтов обратно в бизнес-объект, потому что, как утверждается,
"Не удалось загрузить файл или сборку
«CC.BusObjects,
Версия = 2.12.1.47, Культура = нейтральная,
PublicKeyToken = af56fdb58c626305 'или
одна из его зависимостей. Расположенный
определение манифеста сборки делает
не совпадает со ссылкой на сборку.
(Исключение из HRESULT: 0x80131040) "
Я попробовал соответствующие версии, но, похоже, ничего не работает, если на проект BusObjects ссылаются как на проект, а не на внешнюю сборку. К сожалению, я должен иметь BusObjects внутри решения для отладки.
Что я могу сделать, чтобы исправить эту проблему? Я слышал о перенаправлении версий, но не могу заставить его работать со строго названной сборкой, но, возможно, я делаю это неправильно.
Вот код сериализации и десериализации:
public static byte[] ToBinary(Object objToBinary)
{
MemoryStream memStream = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter(null,
new StreamingContext(StreamingContextStates.Clone));
formatter.Serialize(memStream, objToBinary);
memStream.Seek(0, SeekOrigin.Begin);
return memStream.ToArray();
}
public static object BinaryTo(byte[] objFromBinary)
{
MemoryStream ms = new MemoryStream(objFromBinary);
BinaryFormatter formatter = new BinaryFormatter();
ms.Position = 0;
object obj = formatter.Deserialize(ms);
return obj;
}
Для сериализации:
[WebMethod]
public byte [] GetContacts()
{
return ToBinary(BusObjects.GetContacts());
}
Для десериализации:
byte [] bts = ContactService.GetContacts();
List<Contact> lstContacts = (List<Contact>) BinaryTo(bts);