Я пытаюсь выяснить способ обновления сборок, используемых нашей рабочей средой выполнения (пользовательские действия), при этом все еще можно загружать (десериализовать) старые экземпляры. Моя ситуация такова:
- У экземпляра рабочего процесса создается и сохраняется
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, которые имеют взаимную зависимость друг от друга.
Что может вызвать такое поведение и как мы можем его обойти? Кроме того, если у кого-то есть стратегия обновления рабочих процессов, которая не предполагает запуск сборок сборок (старые и новые версии в том же домене приложения), они будут приветствоваться.