当我尝试从实例存储加载工作流时,我遇到了问题。它似乎无法反序列化此工作流程。
这是我的代码:
//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 = neutral,PublicKeyToken = null]]'无法在assembly'System.Activities,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35'。检查被序列化的类型与被反序列化的类型具有相同的合同,并使用相同的程序集。
如果我可以启动并保持工作流程,我不明白为什么会出现此错误 之前。你可以帮帮我吗?请
由于
答案 0 :(得分:0)
可能有几个原因。
最常见的是工作流定义在持久化时间和重新加载时间之间发生了变化。目前暂不行。
另一种可能性是,工作流程在一台计算机上启动,之后又在另一台没有所有必需程序集的计算机上恢复。
另一种可能性是,由于某些其他代码在第一次执行时已加载了相关类型,并且在重新加载工作流状态时未加载。现在通常只使用CLR规则找到并加载程序集,但使用常规规则可能无法使用它。
答案 1 :(得分:0)
最后,我解决了在运行时解析程序集的错误:
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;
}