UiPathで高度なデバックを実施する

# UiPathで高度なデバックを実施する
これまでの記事で、DLLをUiPathから直接呼び出す手法をご紹介しました

- [UiPathでライブラリを直接呼出す](https://qiita.com/takusonix/items/a199be5468cd3c6d56ea)
- [UiPathでライブラリに引数を設定して呼び出す](https://qiita.com/takusonix/items/0ac407301570ca433556)
- [UiPathでライブラリに引数を設定して呼び出し、処理結果を取得する](https://qiita.com/takusonix/items/28b1599f762d2705e4b5)

本記事では、Visual Studioでブレイクポイントを設定して、高度なデバック方法をご紹介します。

■ 実施例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/7162dc87-4278-4a44-b567-d409d1e3b7d6.png)


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

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

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


## カスタムライブラリ
前回の記事で使用したサンプルの[カスタムライブラリ](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の実装
こちらの記事でご紹介した記事がデバッグを捕捉しやすいので、こちらの実装を流用します
https://qiita.com/takusonix/items/0ac407301570ca433556

### 実装（完成版）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/e23077dd-a7ef-833e-5aab-3d2b9d7e7181.png)

## デバッグの手法
### 1. ブレイクポイントの設定
DLLのソースをVisual Studioで開き、デバッグポイントにブレイクポイントを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/e7884303-edbe-2141-104d-c0491ed6424b.png)

### 2. ビルド
ビルドを行って、DLLを生成します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/89efd156-b40e-20ab-b593-1c81da064713.png)

### 3. pdbファイル
DLLと同時にpdbファイルが作成されていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/22ae080f-2167-9b4d-0e29-aae58137dafd.png)

### 4. DLLとpdbファイルをUiPathプロジェクトファイルに格納
UiPathのプロジェクトフォルダにDLLと一緒に、pdbファイルも格納します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/e01d5d64-055e-5bc1-9c0f-a4300dfd3965.png)

### 5. UiPathプロジェクトの実行
Assembly.LoadFileでDLLロードされるUiPathのプロジェクトを実行し、
MessageBoxなどで、ユーザの入力待ち状態にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/e23077dd-a7ef-833e-5aab-3d2b9d7e7181.png)

### 6. プロセスのアタッチを選択
UiPathでMessageBoxが開かれている状態で、VisualStudioのデバッグから、「プロセスのアタッチ」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/a7225a3d-a9db-f638-d86e-e1a57e83067e.png)

### 7. 対象のプロセスにアタッチ
検索窓に、`UiPath`と入力し、プロジェクト名または、ロボット名と一致するプロセスを選択して、右下の「アタッチ」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/624a4d8c-0d0a-11ce-a53b-06373699c078.png)


### 8. デバッグ開始
Visual Studioがデバッグ表示に切り替わります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/47459e4d-8737-7674-b0b3-e5833b753fc1.png)

### 9. ブレイクポイントで停止
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/c6663140-6fec-db2f-af4a-70ae5446f389.png)

### 10. 高度のデバッグを実施
ラムダ式を含んだ実装をイミディエイトウインドウで確認したり、
message引数の値や、その他の情報を自動パネルから確認したり

UiPath以上に有用なDebugが実施できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/7162dc87-4278-4a44-b567-d409d1e3b7d6.png)

## 実践例
[UiPathでExcelを操作する(活用編: 名前を付けて保存する[完成版])](https://qiita.com/takusonix/items/d8070b61c06900d75c92)を利用して、実際にデバッグしてみます。
### 1. フローを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/740d645f-fe07-5004-5f0e-ca04757e9c83.png)

### 2. プロセスアタッチ用のメッセージボックス追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/82d0d55e-f3f2-00c7-c0fa-f715b028755f.png)

### 3. ロボ実行
メッセージボックスの表示を確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/11cff3a2-910a-a594-ad89-f95220eeabe5.png)

### 4. プロセスのアタッチ
Visual Studioでプロセスにアタッチする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/e4385f59-3b57-576f-bbe8-a4b7f428bf3c.png)

### 5. デバッグ開始
ブレイクポイントで止まります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/169804c8-2ef0-7ce8-3b2b-24606fa54827.png)

## 調査開始
### a)アクティビティの引数調査
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/1f32c2fb-81e8-3733-111c-c3ab198be8ee.png)

### b) Comオブジェクトの調査
UiPathのデバッグでは調査できない、Comオブジェクトや動的ビューも、Visual Studioなら展開可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/5a7cd8c4-382f-8604-4f95-9d7b4ac6f7d2.png)


## 終わりに
本投稿では、DLLと一緒にPDBファイルを配置し、VisualStudioからデバックメニューのプロセスアタッチから、UiPathのロボットを捕捉し、事前に設定したブレイクポイントで、処理を停止させる方法と実践的な調査例をご紹介しました。

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