XAML中的NativeActivity加载COMPILED工作流抛出表达式活动类型'CSharpValue1'需要编译才能运行
问题描述:
这是在Windows工作流程中使用C#表达式时发生的一个已知错误。文章https://docs.microsoft.com/en-us/dotnet/framework/windows-workflow-foundation/csharp-expressions#CodeWorkflows解释了原因以及如何解决问题。它在标准工作流程中对我来说都很好,但只要我将自定义NativeActivity添加到WF中,我又会得到相同的错误!XAML中的NativeActivity加载COMPILED工作流抛出表达式活动类型'CSharpValue1'需要编译才能运行
在我如何加载XAML工作流和简单NativeActivity(这是测试工作流中的唯一活动以及该活动内部的一个简单分配表达式)的代码下方。
加载和通过XAML调用WF:
`XamlXmlReaderSettings settings = new XamlXmlReaderSettings()
{
LocalAssembly = GetContextAssembly()
};
XamlReader reader = reader = ActivityXamlServices.CreateReader(new XamlXmlReader(fileURL, settings));
ActivityXamlServicesSettings serviceSettings = new ActivityXamlServicesSettings
{
CompileExpressions = true
};
var activity = ActivityXamlServices.Load(reader, serviceSettings);
WorkflowInvoker.Invoke(activity);`
做它的代码抛出同样的异常:
Variable<string> foo = new Variable<string>
{
Name = "Foo"
};
Activity activity = new Sequence
{
Variables = { foo },
Activities =
{
new TimeExecuteUntilAborted
{
Activities =
{
new Assign<string>
{
To = new CSharpReference<string>("Foo"),
Value = new CSharpValue<string>("new Random().Next(1, 101).ToString()")
}
}
}
}
};
CompileExpressions(activity);//the method from the article mentioned above
WorkflowInvoker.Invoke(activity);
本土活动:
[Designer("System.Activities.Core.Presentation.SequenceDesigner, System.Activities.Core.Presentation")]
public sealed class TimeExecuteUntilAborted : NativeActivity
{
private Sequence innerSequence = new Sequence();
[Browsable(false)]
public Collection<Activity> Activities
{
get
{
return innerSequence.Activities;
}
}
[Browsable(false)]
public Collection<Variable> Variables
{
get
{
return innerSequence.Variables;
}
}
protected override void CacheMetadata(NativeActivityMetadata metadata)
{
metadata.AddImplementationChild(innerSequence);
}
protected override void Execute(NativeActivityContext context)
{
context.ScheduleActivity(innerSequence);
}
}
答
你TimeExecutedUntilAborted类似乎是罪魁祸首。我可以使用我自己的模板NativeActivities中的一个来替换,而且您的工作流可以很好地使用表达式。我猜测你的类在解析你的代码时在编译器方法中导致了一个问题。我使用此文档作为我的NativeActivity的示例:https://msdn.microsoft.com/en-us/library/system.activities.nativeactivity(v=vs.110).aspx。
答
Sizzle Finger的答案是没有解决办法,但指出我正确的方向来简单地检查什么是不同的。它出来了,简单的调用基类方法丢失:
protected override void CacheMetadata(NativeActivityMetadata metadata)
{
base.CacheMetadata(metadata); // !! This needs to be added
metadata.AddImplementationChild(innerSequence);
}