UiPathでライブラリに引数を設定して呼び出す

# UiPathでライブラリに引数を設定して呼び出す

前回の記事[「UiPathでライブラリを直接呼び出す」](https://qiita.com/takusonix/items/a199be5468cd3c6d56ea)の拡張編です。
UiPathのプロジェクトファイルに格納されたDLLに対して、引数を設定して呼び出す方法を紹介します。

## 開発のきっかけ
最近では当たり前ですが、昔はUiPathでカスタムライブラリを作成するには、
Visual StudioでDLLを作成し、Nuget ExplorerなどでDLLをnuget化して利用しかありませんでした。

UiPathでデバッグするにも、Immediate Panelがなかったり、現時点でもComやラムダ式をデバッグしたり
解析することができませんでした。

## お約束事項（免責事項）
この記事は2020年6月時点の情報を基に作成しております。
記事の内容は私個人の見解であり、所属する組織の公式見解ではありません。

## カスタムライブラリ
前回の記事で使用したサンプルの[カスタムライブラリ](https://github.com/takusonix/UiPathCustomLibrary/raw/master/UiPathCustomLibrary/bin/Release/UiPathCustomLibrary.dll)を使用します

## ソース内容
前回のソースと同じものです。
今回は、Test2のメソッドを使用します。

```cs
using System.Windows;

namespace UiPathCustomLibrary
{
    public static class TestClass
    {
        public static void Test1()
        {
            MessageBox.Show("Hello World");
        }
        public static void Test2(string message)
        {
            MessageBox.Show(message);
        }

        public static int Test3(int a, int b)
        {
            return a + b;
        }
    }
}
```

## UiPathのプロジェクト構成
こちらも、前回と同様の構成を想定しております。
カスタムライブラリのサンプル(UiPathCustomLibrary.dll)はプロジェクト直下に格納しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/99629677-89ed-b2f6-d796-0899c318af58.png)

## UiPathの実装
基本的には、前回と同様の実装です。変更点は以下の3つです。

- 「6.変数追加」で引数用の変数`paramObj`を1次元配列のオブジェクト`Object[]`で追加し、「7.変数の値を設定」で値を設定します。
- 「7.変数の値を設定」では、使用するメソッド名を「Test1」から「Test2」に変更します。
-  最後に、「10.処理の呼び出し」で引数を設定した呼び出しに変更します。



### 1. アセンブリ変数の作成
UiPathで`asm`という変数を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/6dbbfe25-540d-2fec-27b2-71ebb9e1e047.png)
### 2. 型を変更
asmの型を`Browse for Types...`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/7d337e65-9ba7-ec85-11c8-207bfbf97526.png)
### 3. 型名
Type Nameに`System.Reflection.Assembly`を入力し、Asssemblyを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/41e24e2b-01c3-4fcc-126a-2e75574e5fd2.png)

### 4. Assignの追加
Assign(代入)アクティビティを追加し、左辺に`asm`を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/b39520fc-1f16-cb8e-a852-cec6e2221be9.png)

### 5. Assignの値を設定
Assignの右辺に以下の値を設定します。

```cs
Assembly.LoadFile( _
    Path.Combine( _
	    Environment.CurrentDirectory, _
		"UiPathCustomLibrary.dll" _
	) _
)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/ec4de0f8-38b4-790a-79d9-14b1d4c4808c.png)

***これで、DLLをロードすることができました。***

### 6. 変数の追加
実行するメソッドの変数を追加します

- 名前空間(`usingName`) : `String`
- クラス名(`className`) : `String`
- メソッド名(`methodName`) : `String`
- 引数(`paramObj`) : `System.Object[]` or `Object[]`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/1f864b72-a967-e550-d7c8-e5e99cd1627d.png)


### 7. 変数の値を設定
変数に値をそれぞれ設定します。

- usingName = "UiPathCustomLibrary"
- className = "TestClass"
- methodName = "Test2"
- paramObj = {"Hello RPA World!"}

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/3aff0a50-94c2-4da0-e40e-75951f6a4a78.png)


### 8. 実行結果の変数を追加
実行結果を設定する変数 `resultObj` を追加し、変数の型を`Object`に変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/dc8caf2b-7fbc-b908-4f4f-1f34919a331e.png)


### 9. Assignの追加
実行と実行結果を設定するAssignを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/4e601083-37d1-df29-c2d8-6a13310185f6.png)

### 10. 処理の呼び出し
resultObjの値に、以下の値を設定します

```cs
asm _
    .GetType( usingName + "." + className ) _
    .GetMethod(methodName) _
	.Invoke(Nothing, paramObj)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/662c7d66-c81a-4bf5-f3f0-cfadd08e12b5.png)

## UiPathの実行
実行すると、Hello Worldのメッセージが表示されます。
（メッセージボックスが前面に表示されてない場合、画像の通り、タスクバーからUiPathRobotの無名のタスクをせんたくしてください。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/053ecb9b-a122-d376-61f5-963586afc8c0.png)

## 終わりに
本投稿では、メソッドに引数を設定して呼び出す方法をご紹介しました。
サンプルのカスタムライブラリで用意している Test3のメソッドや、引数の設定、実行結果の取得については、別投稿します。

もし、よければLGTMをお願いします。