Share via


Using reference-type arguments in a workflow (WF)

Prior to the release candidate for .Net Framework v4, it was allowed to use arguments of a reference type with no wrapping or transformation. However, this led to some confusion concerning how reference types were passed to multiple instances of a workflow, so in the release version of .Net 4, some additional marshalling is needed, requiring the use of either LambdaValue<> or VisualBasicValue<> to pass the argument into the workflow.

For a list of changes between Beta 2 and RC for Windows Workflow Foundation, see the following entry:

http://blogs.msdn.com/b/endpoint/archive/2010/02/10/4-0-beta2-rc-wcf-wf-breaking-changes.aspx

In the following example, a TextBoxWriter (a custom implementation of System.IO.TextWriter that writes to a TextBox control on a form) is passed into a workflow to be used as the output stream for a WriteLine activity. A LambdaValue<> activity is used to assign the reference object to the activity; it is also used to pass the reference type into the workflow in the first place.

Hosting code:

    var workflow = new MyWorkflow();            
    workflow.Writer = new LambdaValue<TextWriter>(context=>new TextBoxWriter(textBox1));
    WorkflowInvoker.Invoke(workflow);

Workflow code:

    public class MyWorkflow : Activity
    {
        public InArgument<TextWriter> Writer { get; set; }
       
        public MyWorkflow()
        {
            this.Implementation = () => new WriteLine()
            {
                Text = "Hello World",
                TextWriter = new LambdaValue<TextWriter>(context => Writer.Get(context)) 
            };          
        }
    }