この文書の最新版は
http://naka.wankuma.com/site/column/dotnet/00036.htm
シーケンシャルワークフローコンソールアプリケーションを作成します。
ワークフローが出ます。
ツールボックスのCallExternalMethodを
ドラッグアンドドロップします。
適当にインターフェイスを作成し、System.Workflow.Activities.ExternalDataExchange属性を付けます。(ここがポイント1!!!)
ついでに実装クラスも作成しておきます。
namespace WorkflowLibrary1
{
[System.Workflow.Activities.ExternalDataExchange]
public interface IAdd
{
int Add( int x, int y );
}
class Class1: IAdd
{
#region IAdd メンバ
public int Add(int x, int y)
{
return x + y;
}
#endregion
}
}
アクティビティを選択して、InterfaceTypeで参照ボタンをクリックすると
型の参照と選択ウィンドウが開くので、IAddを選択します。
続いてMethodNameを設定します。
パラメータが自動で出てきます。
xとyと(ReturnValue)を設定するのですが、今回はすべて新規でプロパティを作成しました。
実装クラスの登録を行います。
System.Workflow.Activities.ExternalDataExchangeService edx = new System.Workflow.Activities.ExternalDataExchangeService();
workflowRuntime.AddService(edx);
edx.AddService(new WorkflowLibrary1.Class1());
ここがポイント2!!!
- 実装クラスとInterfaceの関連付けは不要
- 1インターフェイスに登録できる実装クラスは1つのみ(2つ目で落ちる)
- ワークフローランタイムにサービス登録をしてから、edxにサービス登録をする(逆にすると2行目で落ちる)
これでOKですが、確認のためのコードを以下のようにしました。
前後にデータセットと、出力用のコードアクティビティを設定して、
private void codeActivity1_ExecuteCode(object sender, EventArgs e)
{
this.callExternalMethodActivity1_x1 = 10;
this.callExternalMethodActivity1_y1 = 20;
}
private void codeActivity2_ExecuteCode(object sender, EventArgs e)
{
Console.WriteLine(this.callExternalMethodActivity1__ReturnValue_1.ToString());
Console.ReadLine();
}
このようにして実行します。
以上で、CallExternalMethodActivityが使えます。
#長いよ