2017-10-11 8 views
0

から変数を取得する私はWindowsワークフロー財団(WWF)を使用しています。変数を定義した1つのシーケンスでアクティビティ(XAML)を作成しました。Windowsワークフロー:WorkflowApplication

私はWorkflowApplicationのインスタンスを作成することにより、コンソールアプリケーションでの活動を実行します。コンソールアプリケーションで変数の値を取得するにはどうすればよいですか?

私はXMLでWorkflowApplicationのインスタンスを保持し、その中に私は私の変数とその値を見ました。 XMLから変数の値を取得する正しい方法はありますか?

+0

変数はアクティビティにスコープが設定されています。コンソールアプリケーションで値を取得するには、引数を使用する必要があります。 –

+0

WorkflowApplicationインスタンスはInArgument が含まれているWorkflowDefinitionプロパティがあります。 InArgumentで値を取得するには、context.GetValue()を呼び出す必要があります。 WorkflowApplicationを使用するコンソールアプリケーションからコンテキストを取得するにはどうすればよいですか? – Porfus

+0

あなたは、私の答えを参照してください –

答えて

1

は、だからあなたの最後のコメントにあなたはワークフローが完了する前に、コンソールアプリケーションの状態を取得したいと述べました。残念ながら、In/OutとOutの引数は、ワークフローの完了時にのみ利用可能です。しかし、ワークフロー変数や引数以外の構造を使ってホストプロセスと通信する方法があります。

それを行うための方法の一つは、ホストプロセスと対話するために使用することができますカスタム拡張機能を使用することです。エクステンションはどのようなタイプでもよく、ワークフローとホストプロセスで使用できます。完全な例:

using System; 
using System.Activities; 

namespace WorkflowDemo 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var app = new WorkflowApplication(new MyCustomActivity()); 
      var myExtension = new MyCommunicationExtension(); 
      myExtension.MyValueChanged += (s, e) => Console.WriteLine(myExtension.MyValue); 

      app.Extensions.Add(myExtension); 
      app.Run(); 

      Console.ReadKey(); 
     } 
    } 

    public class MyCommunicationExtension 
    { 
     public string MyValue { get; private set; } 

     public event EventHandler<EventArgs> MyValueChanged; 

     public void OnMyValueChanged(string value) 
     { 
      MyValue = value; 
      MyValueChanged?.Invoke(this, EventArgs.Empty); 
     } 
    } 

    public class MyCustomActivity : CodeActivity 
    { 
     protected override void Execute(CodeActivityContext context) 
     { 
      var extensionObj = context.GetExtension<MyCommunicationExtension>(); 
      if (extensionObj != null) 
      { 
       extensionObj.OnMyValueChanged("Hello World"); 
      } 
     } 
    } 
} 
+0

あなたの方法は、ブックマークが使用されていない場合は動作します。終了する前に、コンソールアプリケーションからActivity状態を内部的に調べる必要があります。 – Porfus

+0

@Porfus私の改訂版の回答を参照してください。 –

関連する問題