UiPath Developer Community 第8回ワークショップ 覚え書き「カスタムアクティビティの、デバッガによるデバッグ方法について」

[UiPath Developer Community 第8回ワークショップ](https://www.uipath.com/ja/resources/knowledge-base/tag/japan-developer-community) で聞いてきた内容の覚え書き。。

行ってきました、第8回。回を追うごとに申し込みが困難になってますね、、。ちなみに次回は先着順になっていて、あっという間に埋まってしまいました。。。

さて今回のワークショップはEvent Monitoring やAI連携などがありましたが、自分的に目玉だったのは 「Debugging Custom Activities」つまり「カスタムアクティビティの、デバッガによるデバッグ方法について」です。


## Visual Studioからデバッグしたい

ちょっとまえ[UiPathにおけるカスタムアクティビティの開発方法](https://qiita.com/search?q=tag%3AUiPath+user%3Amasatomix)を結構調べていたのですが、**情報がなくて困っていたのが開発したアクティビティのデバッグ**です。開発したアクティビティはnupkgになってUiPath StudioやRobotから実行されるわけで、Visual Studioからデバッグ起動って出来ないなーっておもってました。

今回の説明で[Visual Studio デバッガーで実行中のプロセスへのアタッチ](https://docs.microsoft.com/ja-jp/visualstudio/debugger/attach-to-running-processes-with-the-visual-studio-debugger?view=vs-2017) というやりかたを教えてもらいました。起動しているプロセスに対して、あと付けでVisual Studioのデバッガを接続する方法です。

まあ、よくよく聞いてるとUiPathの固有のやり方というよりはVisual Studioでのデバッグの一般論ぽいです。Visual Studio開発に慣れてるヒトにはもしかして当たり前の事だったのかも。

まあJavaでEclipseのケースでも、たとえばMavenで起動したWEBアプリをデバッグするとき

```
set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8000,suspend=n -Xmx1024m -XX:MaxPermSize=128m
```
ってオプションつけて起動することでEclipseからデバッグできるようになりますが、コレと一緒ですね。


## やってみる
今回サンプルでつかってる、カスタムアクティビティのソースです。

https://github.com/masatomix/UiPath_Path

このプロジェクトがVisual Studio上で読み込まれている状態で、かつ、UiPath Studio側でこのアクティビティがnupkgとしてインストールされている状態だとします。


あ、ココで**nupkgに入れるためのDLLのビルドや、そのDLLをnupkg化する手順について、下記の注意点**があります。

### 注意点１：ReleaseでなくてDebugでビルドする。

[UiPath Studioで使用するカスタムアクティビティの作成方法#いったんビルド](https://qiita.com/masatomix/items/1f63513e80313a99faeb#%E3%81%84%E3%81%A3%E3%81%9F%E3%82%93%E3%83%93%E3%83%AB%E3%83%89) では、

> ツールバーの Debug をReleaseへ変更し、ビルド>>ソリューションのビルド を選択します。

と書きましたが、デバッグのための情報を保持したDLLを作成するため、Debugのままでビルドします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/4aacf5bc-d3ee-6742-ea31-722eb968a7e8.png)


Debugでビルドすると、下記の出力(コンソール)からも分かるとおり、DLLファイルは Debugのディレクトリに出力されます。

```
1>------ すべてのリビルド開始: プロジェクト:Utils, 構成: Debug Any CPU ------
1>  Utils -> Z:\git\Path\Utils\bin\Debug\kino.UiPath.Utils.Activities.dll
========== すべてリビルド: 1 正常終了、0 失敗、0 スキップ ==========
```

次に書きますが、nupkgにする際にはこちらのDLLを使用します。

### 注意点２：nupkg 作成コマンド nuget pack のオプション変更

さて、上記で作成したDLLをnupkgにするのですが、[UiPathのカスタムアクティビティのnupkgの作り方](https://qiita.com/masatomix/items/d62683a158da6d35f24d#%E3%81%9F%E3%81%B6%E3%82%93%E3%82%B3%E3%83%AC%E3%81%A7ok%E3%81%AA%E6%A7%8B%E6%88%90) では

```
Z:\git\Path\Utils> nuget pack Utils.csproj -Prop Configuration=Release
```

と書いたオプションの「Release」を

```
Z:\git\Path\Utils> nuget pack Utils.csproj -Prop Configuration=Debug
```

と「Debug」にします。そうすることで、DebugのディレクトリのDLLをつかってnupkgファイルを作成してくれます。

ついでにもう一点、細かい話ですが、[UiPathのカスタムアクティビティ開発で、リソースの外部化とローカライズを行う](https://qiita.com/masatomix/items/96d997608c02ca37a0d9#%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%92nupkg%E3%81%AB%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B)で、nupkg作成用の設定ファイル「Utils.nuspec」に、下記のように

```xml
<files>
  <file src="bin\Release\ja\*.dll" target="lib\net45\ja" />
</files>
```

で「Release」ディレクトリのリソースファイルを明示的に指定していますが、厳密にはDebug側のファイルを利用するように記載を変えた方がよいでしょう。今回は、Release側に出力されているものをそのままつかっちゃえばいいやって事で、ココはいじらないでやってます。


### デバッガからデバッグする
この作成したnupkgを UiPath Studioにインストールしておきましょう。

以上で、Visual Studio上でカスタムアクティビティのプロジェクトを読み込んだ状態でかつ、UiPath Studio側でデバッグ用nupkgがインストールされている状態になりました。


UiPath Studio上でカスタムアクティビティを使用したワークフローを作成し、UiPath Studioからワークフローを起動しておきます。その際、ワークフローが終了してしまわないよう MessageBox などで、実行中の状態を保っておくようにします。というのは、Visual Studioは起動しているプロセスに対してデバッガをアタッチするのですが、今回アタッチしたいプロセス「UiPath.Executor.exe」はワークフロー実行中にしか起動していないからです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/f309f4bc-1f47-79cf-7110-8028632f3ea5.png)

ようするにこんな感じのワークフローを作成し実行しておきます。

つづいて Visual Studio 側で「デバッグ >> プロセスにアタッチ」を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/b9b89b6c-5d13-3b85-503e-49edcfa9c0e6.png)


表示されたダイアログ上で「UiPath.Executor.exe」を選択し「アタッチ」をクリック。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/19e8279b-f254-7d71-4aa2-e754f3d73643.png)

Visual Studioがピピピって(?)反応するので、そしたら MessageBox を押下してワークフローをすすめると、、、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/d9fbecbf-787c-22dc-d0c0-cff70eef74c8.png)

おお！デバッグ接続できましたね！paths変数の値などもちゃんと確認することが出来ます。

いやー、これで開発が捗りますね。

今回もとても有意義な情報を収集することが出来ました。ありがとうございます。


## さいごに
デバッグのやり方のスライドと、ノベルティの「ノ・ミカタ」と、お食事。ノ・ミカタは忘年会に向けて需要がありそうです:-)。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/978b8171-2aa6-3fe1-375b-2f338ccec465.png)

食事は「四谷(?)の有名なカレー屋ですよ」 とおっしゃっていました[(たぶんココ)](http://www.aubergine.co.jp/)。辛めでおいしかったです。しかし、スプーンだとお芋をいただくのに限界がありました :-)


おつかれさまでした。。

## 関連リンク

- [Visual Studio デバッガーで実行中のプロセスへのアタッチ](https://docs.microsoft.com/ja-jp/visualstudio/debugger/attach-to-running-processes-with-the-visual-studio-debugger?view=vs-2017) 
- [「現在の設定ではヒットしません シンボルが読み込まれていません」っていわれる件](https://urashita.com/archives/13678)
- [japan-developer-community](https://www.uipath.com/ja/resources/knowledge-base/tag/japan-developer-community) 
- [#UiPath](https://twitter.com/search?q=%23UiPath)
- [カスタムアクティビティ kino.UiPath.Utils.Activities のソース](https://github.com/masatomix/UiPath_Path)
- [NuGet Gallery | kino.UiPath.Utils.Activities](https://www.nuget.org/packages/kino.UiPath.Utils.Activities/)