今回はコンソール実行用モジュールにて引数をコマンドラインオプションで渡せるようにしてみまして、このあたりをやってみて気付いた点があったので記載しておきます。
ワークフローの引数自体は、作成している(または ActivityXamlServices.Load 等で読み込んだ)ワークフローを DynamicActivity にキャストした形で扱う事で設定が可能です。
   1: wfFile = ActivityXamlServices.Load(target)2: '引数が存在するかチェック
3: Dim dynAct = TryCast(wfFile, DynamicActivity)
4: If (dynAct IsNot Nothing) Then
5: For Each child In SetWorkflowArgument(argument).Keys()
6: If Not CheckWorkflowArgument(dynAct, child) Then Continue For
   7:  8: If wfArgs Is Nothing Then wfArgs = New Dictionary(Of String, Object)
   9:         wfArgs.Add(child, GetArgumentValue(argument, child))10: Next
11: End If
  12:  13: ''' <summary>ワークフローの引数を設定</summary>
14: Private Function SetWorkflowArgument(ByVal args As String()) As Dictionary(Of String, Object)
15: Dim result As New Dictionary(Of String, Object)
16: Dim r = From x In args
17: Where x.StartsWith("/")
18: Select x.Replace("/", "")
  19:  20: For Each child In r
21: If (Not child.Contains(":")) OrElse
22: (child.Contains("wfile:")) Then Continue For
  23:  24: Dim splitPosition = child.IndexOf(":")
  25:         result.Add(child.Substring(0, splitPosition), child.Substring(splitPosition + 1))26: Next
27: Return result
28: End Function
  29:  30: ''' <summary>ワークフローに引数が存在するかチェック</summary>
31: Private Function CheckWorkflowArgument(ByVal wf As DynamicActivity, ByVal argsName As String) As Boolean
32: Return wf.Properties.Contains(argsName)
33: End Function
  34:  35: ''' <summary>コマンドライン引数から指定した名称の値を取得</summary>
36: Private Function GetArgumentValue(ByVal args As String(), ByVal argsName As String) As Object
37: Dim r = From x In args
38: Where x.StartsWith("/" + argsName)
39: Select x.Replace("/" + argsName + ":", "")
  40:  41: Return r.First
42: End Function
ざっくりと書くとこのような感じのロジックになります。注意する点は、設定するワークフローの引数は実行時にチェックが行われ存在しない引数を渡した場合は例外が発生する点、引数は大文字小文字をチェックしている点、です。
今回のアプリではコマンドラインで渡されたとしても、ワークフロー上に存在しない引数名だった場合には渡さないようにしています。このあたりの制御が必要ですね。
 
0 件のコメント:
コメントを投稿