Загрузка рабочих процессов предыдущей версии с новой версией сборки

Я пытаюсь выяснить способ обновления сборок, используемых нашей рабочей средой выполнения (пользовательские действия), при этом все еще можно загружать (десериализовать) старые экземпляры. Моя ситуация такова:

  • У экземпляра рабочего процесса создается и сохраняется CustomActivities v.1.0.0.0
  • Развернуть новую версию продукта witch CustomActivities v.2.0.0.0
  • попытайтесь загрузить предыдущие рабочие процессы в новую среду выполнения

Разница между v.1 и v.2 заключается в том, что у нас есть дополнительные классы в сборке. Структура для существующих типов не изменилась, поэтому я бы предположил, что двоичная десериализация все равно будет работать.  Мы перенаправляем все типы из v.1 в v.2 с помощью AssemblyResolve event

if (args.Name.Contains("CustomActivities"))
{
    Type someTypeFromCustomActivities = typeof(WorkflowType);
    return someTypeFromCustomActivities.Assembly;
}

Однако в какой-то момент процесса десериализации мы получаем следующее исключение:

SerializationException: объект с идентификатором 153 реализует интерфейс IObjectReference, для которого все зависимости не могут быть разрешены. Вероятной причиной являются два экземпляра IObjectReference, которые имеют взаимную зависимость друг от друга.

Что может вызвать такое поведение и как мы можем его обойти? Кроме того, если у кого-то есть стратегия обновления рабочих процессов, которая не предполагает запуск сборок сборок (старые и новые версии в том же домене приложения), они будут приветствоваться.

Ответ 1

Событие сборки сборки ничего не делает для изменения ссылок на сборку типов сериализованных типов. Вы пробовали переадресацию привязки сборки на уровне машины от v1 до v2.

Обновление. Я нашел эту ссылку, которая рассказывает об использовании переадресации привязки для пересылки старых рабочих процессов в новые версии с использованием атрибута applyTo.

http://msdn.microsoft.com/en-us/library/aa349375.aspx