UiPathでライブラリを直接呼出す

#UiPathでライブラリを直接呼出す

UiPathでは、OrchestratorやUiPath Goなどから、カスタムライブラリを追加することが容易になりましたが、実証実験の段階から、Orchstratorを入れたり、UiPath Goにお客様専用のライブラリを登録することは困難だったり、そもそもネットワークのホワイトリストですら登録いただくことに、大変だったりしますよね

本投稿では、自分で作ったカスタムライブラリ（DLL）を.nugetからではなく、直接、呼び出す方法を紹介します。

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

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

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

## 利用イメージ
利用イメージは、カスタムライブラリのDLLを特定のフォルダ（例えばプロジェクトの配下など）に格納し、
xamlファイルをInvokeするのと同じような感じで、DLLファイルから呼び出してみたいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/2737c591-9a81-3a3e-8dc6-ccf54a747e2f.png)

## カスタムライブラリ
サンプルで利用できるDLLはこちらで用意しました。
https://github.com/takusonix/UiPathCustomLibrary/raw/master/UiPathCustomLibrary/bin/Release/UiPathCustomLibrary.dll

ソース内容はこちらです。

```C#
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;
        }
    }
}
```

サンプルDLLを利用せずに、ご自身で用意いただいても構いません。

## UiPathのプロジェクト構成
UiPathのプロジェクト構成は、このようになっています。
カスタムライブラリのサンプル(UiPathCustomLibrary.dll)はプロジェクト直下に格納しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/99629677-89ed-b2f6-d796-0899c318af58.png)

## UiPathの実装
### 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)
- クラス名(className)
- メソッド名(methodName)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/b39d6dfb-95e4-ea1d-e0f8-433349a6b586.png)

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

- usingName = "UiPathCustomLibrary"
- className = "TestClass"
- methodName = "Test1"

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/8710c002-4441-3a0a-0969-f5204eea4275.png)

### 8. 実行結果の変数を追加
実行結果を設定する変数 `resultObj` を追加し、変数の型を`Object`に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/82fcc078-7c25-30ac-3efc-a16ab8a2c29b.png)

### 9. Assignの追加
実行と実行結果を設定するAssignを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/e1d75409-3d7f-0fbe-9cf1-b4eea31a9175.png)

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/f9540822-0bd1-5d4b-fd27-0b0691825910.png)

## UiPathの実行
実行すると、Hello Worldのメッセージが表示されます。
（メッセージボックスが前面に表示されてない場合、画像の通り、タスクバーからUiPathRobotの無名のタスクをせんたくしてください。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/c7a08746-4570-a41d-0c58-f58ac4964d04.png)

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

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