Ошибка при загрузке рабочего процесса из хранилища экземпляров.Тип не найден - PullRequest
0 голосов
/ 19 января 2012

У меня проблемы при попытке загрузить рабочий процесс из хранилища экземпляров. Кажется, что он не может десериализовать этот рабочий процесс.

Это мой код:

//Get workflow through WorkflowDefinitionManager
        Activity workflow = WorkflowDefinitionManager.GetWorkflow(wfDefinitionId);

        //Create wf application
        WorkflowApplication instance = new WorkflowApplication(workflow);
        instance.InstanceStore = InstanceStore;

        instance.Completed += WorkflowApplication_OnCompleted;
        instance.Aborted += WorkflowApplication_OnAborted;
        instance.Idle += WorkflowApplication_OnIdle;
        instance.OnUnhandledException += WorkflowApplication_OnUnhandledException;
        instance.PersistableIdle += WorkflowApplication_OnPersistableIdle;

        instance.Load(inGuid);  //<--- I get the error here

Ошибка:

Десериализатору не удалось загрузить тип для десериализации, так как тип 'System.Activities.Variable`1 + VariableLocation [[MYCLASS, MYASSEMBLY, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null]]' не найден в сборка 'System.Activities, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = 31bf3856ad364e35'. Убедитесь, что сериализуемый тип имеет тот же контракт, что и десериализованный тип, и используется та же сборка.

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

Спасибо

Ответы [ 2 ]

0 голосов
/ 26 января 2012

Наконец я решил свои ошибки при сборке во время выполнения:

AppDomain appDomain = AppDomain.CurrentDomain;
appDomain.AssemblyResolve += AppDomain_AssemblyResolve;
instance.Load(inGuid);
appDomain.AssemblyResolve -= AppDomain_AssemblyResolve;

Это обратный вызов:

private Assembly AppDomain_AssemblyResolve(object sender, ResolveEventArgs e)
    {

        try
        {
            string strTempAssmbPath = ExtensionsFolder + e.Name.Substring(0, e.Name.IndexOf(",")) + ".dll";
            return Assembly.LoadFile(strTempAssmbPath);
        }
        catch (Exception ex)
        {
            log.Error(ex);

        }
        return null;
    }
0 голосов
/ 19 января 2012

Может быть несколько причин.

Наиболее распространенным является то, что определение рабочего процесса изменялось с момента его сохранения до момента его перезагрузки.Сейчас это не пойдет.

Другая возможность состоит в том, что рабочий процесс был запущен на одном компьютере, а затем возобновлен на другом компьютере, на котором нет всех необходимых сборок для его возобновления.Другая возможность состоит в том, что рассматриваемый тип уже был загружен из-за какого-то другого кода, выполняющегося в первый раз, и не загружается при перезагрузке состояния рабочего процесса.Теперь обычно сборка будет просто найдена и загружена с использованием правил CLR, но она может быть недоступна с использованием обычных правил.

...