0

WorkflowServiceパラメータに を含むxaml a へのシリアル化に問題がActivityBuilderありBodyます。一部のC# 式がカスタム型を参照するためActivityBuilder、 に C# 式が含まれており、シリアル化されWorkflowServiceた がアクティブになりません。実際のエラーは、「タイプ 'SomeTypeIPassToAnArgument' が定義されていません」です。

MyActivityBuilderは、要素を含む xaml ファイルから作成されますTextExpression.NamespacesForImplementation。のシリアル化時にこれが欠落しており、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 からワークフローを読み込んでWorkflowServiceVirtualPathProvider.

ありがとう!

4

1 に答える 1