我在序列化到WorkflowService
包含ActivityBuilder
其Body
参数的 xaml a 时遇到问题。ActivityBuilder
包含 C# 表达式并且序列化不会WorkflowService
激活,因为某些 C# 表达式引用自定义类型。实际错误是“未定义类型'SomeTypeIPassToAnArgument'”。
MyActivityBuilder
是从包含一个TextExpression.NamespacesForImplementation
元素的 xaml 文件创建的。序列化时缺少此内容WorkflowService
,这似乎是问题的原因。
我发现如果我序列化ActivityBuilder
自身,则包含命名空间,但使用ActivityBuilder.Implementation
失败。不幸的是,当我构建WorkflowService
要序列化时,我必须使用ActivityBuilder.Implementation
它作为它的Body
参数。我尝试使用该TextExpression.SetNamespacesForImplementation
方法来确保将这些附加到实现中,但这并没有帮助。
以下代码段显示了我正在尝试做的事情以及失败的地方。
var loadedXaml = File.ReadAllText(@"C:\workflow.xaml");
Assert.IsTrue(loadedXaml.Contains("NamespacesForImplementation"));
var xamlReader = new XamlXmlReader(new StringReader(loadedXaml));
var builderReader = ActivityXamlServices.CreateBuilderReader(xamlReader);
var builder = XamlServices.Load(builderReader) as ActivityBuilder;
// namespaces are available in the builder itself
Assert.AreNotEqual(0, TextExpression.GetNamespacesForImplementation(builder).Count);
// when saving, the assert fails because the namespaces aren't serialized
var savedXaml = XamlServices.Save(builder.Implementation);
Assert.IsTrue(savedXaml.Contains("NamespacesForImplementation"));
知道为什么这不起作用,或者我可以使用另一种方法吗?最终我的目标是能够从 xaml 加载工作流并将它们合并到一个序列化WorkflowService
中,我可以使用VirtualPathProvider
.
谢谢!