C# 使用DynamicUpdateServices更新工作流实例

C# 使用DynamicUpdateServices更新工作流实例,c#,workflow-foundation-4,C#,Workflow Foundation 4,要确保长时间运行的工作流实例将来可以升级到新的工作流定义,正确的流程是什么 我知道,在继续执行任何新更改之前,我必须对现有XAML调用DynamicUpdateServices.PrepareForUpdate,以便以后调用DynamicUpdateServices.CreateUpdateMap并生成映射文件,用于升级现有工作流实例 我真正不清楚的是,在调用DynamicUpdateServices.PrepareForUpdate之后,应该修改哪个工作流定义(XAML)文件。是调用Dynam

要确保长时间运行的工作流实例将来可以升级到新的工作流定义,正确的流程是什么

我知道,在继续执行任何新更改之前,我必须对现有XAML调用
DynamicUpdateServices.PrepareForUpdate
,以便以后调用
DynamicUpdateServices.CreateUpdateMap
并生成映射文件,用于升级现有工作流实例

我真正不清楚的是,在调用
DynamicUpdateServices.PrepareForUpdate
之后,应该修改哪个工作流定义(XAML)文件。是调用
DynamicUpdateServices.PrepareForUpdate
后创建的(克隆的)XAML文件吗。还是原始的XAML文件

看起来克隆的XAML文件应该是一个明显的选择,但是有一个问题。克隆的XAML文件不包含
ViewStateManager
标记,这意味着您失去了原始XAML中的所有布局


另一方面,如果我使用原始的XAML,那么我应该如何生成更新映射?

我联系了MS支持部门,最终了解了它的工作原理

我从来没有真正接触过克隆的定义。我以前不理解的关键概念是,
DynamicUpdateServices.PrepareForUpdate()
的目的不是真正准备XAML文件,而是准备WF运行时本身,以便它可以通过将修改后的XAML与生成的克隆副本进行比较来生成更新映射(并在调用
DynamicUpdateServices.PrepareForUpdate()
时存储在内存中。因此典型的过程是:

  • 部署工作流定义(
    v1 xaml
  • 修改工作流定义(
    v2 xaml
  • 部署工作流定义(
    v2 xaml
    )*也可以在步骤5之后执行
  • 针对
    v1 xaml调用
    DynamicUpdateServices.PrepareForUpdate()
    (从源代码管理获取)
  • 生成更新映射
    DynamicUpdateServices.CreateUpdateMap()
  • 将更新映射应用于从
    v1 xaml
    保存并启动的现有工作流实例(
    WorkflowApplication.Load(instance,updateMap)

  • 步骤4和5必须在同一个流程实例中完成(或者在大多数情况下,它只是指在同一个主机中).

    我尝试了您的解决方案,但它对我不起作用。因为我不明白步骤4和5是如何执行的,以及xaml v1和v2是如何相互关联的,因为prepareForUpdate和CreateMap应该使用相同的Activity对象或xaml。否则CreateMap方法将失败。@KhurramShakir。是的,这似乎是一个非常复杂的过程。我建议您查看此博客。它讨论了一种可能对您有所帮助的重新托管工作流设计器方法。感谢您的回复,我正在寻找这篇文章,它似乎很有趣……基于我们最初场景的相似性,让我解释一下我目前正在做什么,您可能会就此给我一些其他有用的建议,[最初我将其作为对您答案的回应发布,但被主持人删除。]我的场景如下,我创建了一个工作流更新实用程序,1.我使用基本Xaml文件名和程序集(V1)从用户处。2.我准备了一个更新后的地图,并将其保存为更新后的Xaml。3.我将更新后的Xaml文件加载到project中,并修改工作流。4.修改和重建后,我再次打开更新实用程序,并从用户处获取修改后的Xaml(v2)的输入但当我试图更新运行中的实例时,虽然它们被更新了,但在运行时会产生不良影响,与表达式解析、根等有关。对此有任何其他评论吗?我建议你打开一个新问题并详细描述它。例如,这些不良影响到底是什么,错误消息等等C