.net 向工作流设计器公开NativeActivity变量

.net 向工作流设计器公开NativeActivity变量,.net,workflow,workflow-foundation-4,workflow-activity,.net,Workflow,Workflow Foundation 4,Workflow Activity,我有一个本地活动,它包含一个活动体。此活动的目的是将子活动期间的资源作为变量公开。我遇到的问题是,该变量似乎不能在活动外部使用。我将使用StreamReader作为示例资源 ResourceActivity.cs: [Designer(typeof(ResourceActivityDesigner))] public sealed class ResourceActivity : NativeActivity { [RequiredArgument] public InArgum

我有一个本地活动,它包含一个活动体。此活动的目的是将子活动期间的资源作为变量公开。我遇到的问题是,该变量似乎不能在活动外部使用。我将使用StreamReader作为示例资源

ResourceActivity.cs:

[Designer(typeof(ResourceActivityDesigner))]
public sealed class ResourceActivity : NativeActivity
{
    [RequiredArgument]
    public InArgument<string> Path { get; set; }

    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
    public Activity Body { get; set; }

    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
    public Variable<StreamReader> Resource { get; set; }

    public ResourceActivity()
    {
        this.Resource = new Variable<StreamReader>
        {
            Default = null,
            Name = "reader"
        };
    }

    protected override void CacheMetadata(NativeActivityMetadata metadata)
    {
        if (this.Path != null) metadata.AddArgument(this.Path);
        if (this.Body != null) metadata.AddChild(this.Body);
        if (this.Resource != null) metadata.AddVariable(this.Resource);
    }

    protected override void Execute(NativeActivityContext context)
    {
        this.Resource.Set(context, new StreamReader(this.Path.Get(context)));
        context.ScheduleActivity(this.Body, new completionCallback(Done), new FaultCallback(Faulted));
    }

    private void Done(NativeActivityContext context, ActivityInstance instance)
    {
        var reader = this.Reader.Get(context);
        if (reader != null) reader.Dispose();
    }

    private void Faulted(NativeActivityFaultContext context, Exception ex, ActivityInstance instance)
    {
        var reader = this.Reader.Get(context);
        if (reader != null) reader.Dispose();
    }
}

我无法在工作流设计器的变量列表中查看资源或读取器。我是否缺少CacheMatadata中的某些内容?

如果要在活动本身和子项之间共享变量,则需要将正文定义为ActivityAction而不是Activity类型。请参阅Matt Winkler的博文。

看来答案是向类中添加了一个集合。缓存元数据是不必要的

[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
public Collection<Variable> Variables { get; private set; }

public ResourceActivity()
{
    this.Resource = new Variable<StreamReader> { Default = null, Name = "reader" };
    this.Variables = new Collection<Variable>(new [] { this.Resource });
}
编辑:不,现在出现一个错误,说明变量被定义了多次。如果我忽略了将资源添加到变量集合,它就不会显示


编辑2:我将此作为Microsoft Connect上的一个错误提交,并被告知这是一个已知错误,

您的第一个错误是因为变量正在序列化为xaml,因此当变量反序列化时,构造函数首先添加变量,然后将反序列化的变量添加到集合中,从而导致该错误。将该代码移动到IActivityTemplateFactory中。创建,您将不会出现该错误。您报告的bug似乎是另一个bug,活动不能为其子级创建和公开变量,同时也不能访问它们。某种类型的范围。有同样的问题。找到解决方法了吗?顺便说一句,我实际上在考虑创建一个虚拟子活动,其唯一目的是更新变量。埃芬。可笑。@Will:我们去重组了那个应用程序,因为我们对WF非常失望,而且除了琐碎的东西之外,还缺少任何连贯的文档。MS对WF的支持令人憎恶,由于缺乏足够的解决方法,我们基本上屏蔽了应用程序的这一部分。如果你加上你关于序列化/反序列化的一点作为回答,我会把它标记为已接受。不,这是k。我对WF4并不像你那么失望。能够做一些真正复杂和令人印象深刻的事情。但这是一个新产品,因此没有太多关于它的信息。我同意他们可以为MSDN文档增加更多的清晰度。。。在许多问题上。