如何正确保存WF4 ActivityBuilder

时间:2012-07-26 06:48:39

标签: c# workflow-foundation-4 workflow-foundation

我目前正在保存我的.NET FX 4.0.1 StateMachine活动,如下所示:

var sb = new StringBuilder();
var xamlWriter = ActivityXamlServices.CreateBuilderWriter(
                     new XamlXmlWriter(new StringWriter(sb),
                     new XamlSchemaContext()));
XamlServices.Save(xamlWriter, activityBuilder);

return sb.ToString();

这很好用,生成的XAML看起来不错。不幸的是,它无效。我可以在使用ActivityXamlServices.Load时阅读它,但是当我执行它时,它表示它不知道工作流中定义的属性。在Visual Studio设计器中打开它会产生相同的错误:

  

编译器错误遇到处理表达式“ActiveCall”。 “ActiveCall”未声明。由于其保护级别,它可能无法访问。

通过比较原始XAML和我的代码生成的XAML,我发现了如何解决这个问题。我必须在StateMachine标记前加上此标记:

<mva:VisualBasic.Settings>
    Assembly references and imported namespaces for internal implementation
</mva:VisualBasic.Settings>

顺便说一下:
标签内的文字必须与此完全相同,否则在VS中打开WF时会出错:

  

无法从文本'FooBar'

创建'设置'

问题:
我需要在代码中更改以在生成的XAML中包含此标记吗?

1 个答案:

答案 0 :(得分:1)

我想我找到了答案。

在调用Save之前,我必须使用以下代码:

VisualBasic.SetSettings(activityBuilder, new VisualBasicSettings());

如果activityBuilder是从DynamicActivity创建的,则最好使用以下代码:

VisualBasic.SetSettings(activityBuilder,
                        VisualBasic.GetSettings(dynamicActivity));

如果未使用此选项,则只有扩展方法所需的名称空间不会写入XAML,并且在加载和执行XAML时会导致错误。


我在code project上总结了我的发现。