UiPathでライブラリに引数を設定して呼び出し、処理結果を取得する

# UiPathでライブラリに引数を設定して呼び出し、処理結果を取得する

前回の記事[「UiPathでライブラリを直接呼び出す」](https://qiita.com/takusonix/items/a199be5468cd3c6d56ea)と[「UiPathでライブラリに引数を設定して呼び出す」](https://qiita.com/takusonix/items/0ac407301570ca433556)の拡張編です。
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)を使用します

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

```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つです。

- 「7.変数の値を設定」で、使用するメソッド名を「Test3」に変更し、
- 「7.変数の値を設定」で、引数に「{1,2}」の2つを設定します。
- 「11.処理の呼び出し」で取得した処理結果を表示を追加します。



### 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 = "Test3"
- paramObj = {CType(1, Object), CType(2, Object)}

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/5e01e563-6697-1468-9042-c52353f01827.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/478c2a1a-caf6-86b9-da84-c7c40eb7e86a.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)

## 11. 処理結果の出力
WriteLineアクティビティを追加し、resutObjの値を出力します。

- Text : `"処理結果(resutlObj) = " + resultObj.ToString`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/70419e8d-41c0-1c0b-8b30-f83e3a568017.png)

## UiPathの実行
実行するとTest3の処理結果が、Outputパネルに出力されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/30059f8f-edef-4422-aff5-6619d747f715.png)

## 終わりに
本投稿では、メソッドに引数を設定して呼び出し、処理結果を取得する方法をご紹介しました。

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