【UiPath】カスタムアクティビティの作成（事前準備と実践初級）

前から興味があったカスタムアクティビティの作成にチャレンジして、手順や理解した事をまとめます。
初心者なのでUiPath Activity ガイドの[Creating a Custom Activity](https://activities.uipath.com/docs/creating-a-custom-activity) に沿って進めます。

# 準備① Visual Studioのインストール
[Microsoft Visual Studio](https://visualstudio.microsoft.com/ja/)サイトより、右上の「無償版」をクリック。
![free.png](https://qiita-image-store.s3.amazonaws.com/0/255097/d6271dc9-3f1e-8ebd-24c5-2ad573599f25.png)

左の「Visual Studio Community」のダウンロードボタンをクリック。
![select.png](https://qiita-image-store.s3.amazonaws.com/0/255097/d7bd368b-c8ad-1848-70d5-d0ec56bb0b16.png)

基本はインストーラに沿って進めますが、全部入りだと数十GByteもの容量を食うので最低限に絞る。
といっても今回の目的で最低限必要なコンポーネントってなんだろう？
とりあえず"ワークロード"は選ばず、"個別のコンポーネント"から[Windows Workflow Foundation]を選択。
（１つ選ぶと、必要な関連コンポーネントが自動で選択されます。）
　![wwf.png](https://qiita-image-store.s3.amazonaws.com/0/255097/7966d7a9-90d0-7c38-76ba-a779a3321703.png)

「インストール」を押すと↓ の警告が出るけど気にせず「続行」。これだけでも7GBの容量が必要。
　![warning.png](https://qiita-image-store.s3.amazonaws.com/0/255097/b1fa6dbf-0536-ae17-2d5a-4a67367d9771.png)

Visual StudioについてはこれでOK。

# 準備② NuGet Package Explorerのインストール
[GitHubのNuGet Package Explorerページ](https://github.com/NuGetPackageExplorer/NuGetPackageExplorer/releases)から一番上のzipをダウンロード。
　![Nuget.png](https://qiita-image-store.s3.amazonaws.com/0/255097/d0e99db4-7f47-c0f3-2a58-364a13cdc523.png)

適当なフォルダを作ってzipの中身を解凍。
![NPE.png](https://qiita-image-store.s3.amazonaws.com/0/255097/8425b294-63a9-524c-b0f8-81cf53b0122e.png)

NuGet Package ExplorerについてもこれでOK。
この後は、UiPathガイドの手順に沿って簡単なカスタムアクティビティを作ってみます。

# 実践① Visual Studioでプロジェクト作成
Visual Studioでプロジェクトを新規作成。
プロジェクトの種類は「クラスライブラリ（.NET Framework）」
　![Project.png](https://qiita-image-store.s3.amazonaws.com/0/255097/a0df0164-4def-8e31-5212-6e3f56c19ad5.png)

プロジェクトができたら、メニュー「プロジェクト」→「参照の追加」で、
　System.Activities
　System.ComponentModel.Composition
の２つを追加。どちらもカスタムアクティビティの作成に必要。
　![ref.png](https://qiita-image-store.s3.amazonaws.com/0/255097/0b9b98cf-a421-2b9a-8fed-b783197c6481.png)

ここから先は、カスタムアクティビティをCodeActivity/NativeActivityどちらで作るか決めないといけない。
情報があまり出回ってないのでしっかり理解はできてないけど、

- CodeActivity → 作るのカンタンだけど単純な制御しかできない
- NativeActivity → 作るの難しいけど高度な制御ができる

という事らしい。自作アクティビティで難しい事をやるつもりは無いので、CodeActivityで行く。

# 実践② コーディング開始
といってもUiPathガイドにあるソースのコピペです。初心者は欲を出さずにまずコピペから。

`````Class1.cs（デフォルト名）
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Activities;
using System.ComponentModel;

namespace MathSquareOfSum
{
    public class SimpleFormula : CodeActivity
    {
        [Category("Input")]
        [RequiredArgument]
        public InArgument<double> FirstNumber { get; set; }

        [Category("Input")]
        public InArgument<double> SecondNumber { get; set; }

        [Category("Output")]
        public OutArgument<double> ResultNumber { get; set; }

        protected override void Execute(CodeActivityContext context)
        {
            var firstNumber = FirstNumber.Get(context);
            var secondNumber = SecondNumber.Get(context);
            var result = System.Math.Pow(firstNumber + secondNumber, 2);
            ResultNumber.Set(context, result);
        }
    }
}
`````

コード書いてエラーが無ければ、ソリューション構成のプルダウンをDebug → Releaseに変更して
「ソリューションのビルド」で、プロジェクトフォルダの\bin\Release にDLLが出来ました。
　![dll.png](https://qiita-image-store.s3.amazonaws.com/0/255097/cbf07466-dfb6-ad37-61f4-7db7d69d2194.png)
これをNuGet Package ExplorerでUiPathが食える形にすればいいんだな。

# 実践③ NuGet PackageでUiPath Studioにインストール
### DLL → nupkgに変換
さっきzip解凍した中のNuGetPackageExplorer.exeを実行。

上から３つ目「Create a new Package」を選択。
　![CreateNew.png](https://qiita-image-store.s3.amazonaws.com/0/255097/17b2d636-dc14-6682-ce89-de2c06213f16.png)

右ペインPackage contentsの空欄を右クリック → Add Lib Folder
　![AddLib.png](https://qiita-image-store.s3.amazonaws.com/0/255097/a7eb0105-e933-028c-f232-03d482f3bb19.png)

ペイン中に"lib"ができるので、それを右クリック → Add Existing File..を選択
　![AddLib2.png](https://qiita-image-store.s3.amazonaws.com/0/255097/850e2c7e-8173-0264-528a-0bd6ba63ec9b.png)

さっきBuildしたDLLを選択
　![select.png](https://qiita-image-store.s3.amazonaws.com/0/255097/3897856c-b630-e39f-4016-24c4ddbfe483.png)

Edit → Edit Metadataを選択
　![edit.png](https://qiita-image-store.s3.amazonaws.com/0/255097/088bb537-ee2d-617f-3569-544795f785d5.png)

左ペインがMetadataの入力欄に変わるので、適当に値を入力。
※UiPathガイド曰く、Idは**"Activities"を入れないと後でStudioのManage Packagesに出てこない**との事。
　![metadata.png](https://qiita-image-store.s3.amazonaws.com/0/255097/35620bab-f5aa-dc29-bd08-199afd24c574.png)

File → Saveで保存するとnupkgファイルができた。これがUiPathが食える形式。
　![nupkg.png](https://qiita-image-store.s3.amazonaws.com/0/255097/dc959ff7-e7ab-1c02-d68c-17867c182790.png)

### StudioにManage Packagesからインストール
このnupkgファイルを、UiPath Studioのパッケージ置き場である
"C:\Users\xxxx(ユーザー名)\\.nuget\packages" の下に適当なフォルダを掘ってコピーする。
とりあえず他の既存パッケージにならって \packages\Umemaru\1.2.3 というフォルダにした。
　![pkg.png](https://qiita-image-store.s3.amazonaws.com/0/255097/1ec159be-a67b-53bb-d179-d21d2c273995.png)

これだけではManage Packagesに出てこないので、[アクティビティパッケージの管理](https://studio.uipath.com/docs/managing-activities-packages#section-adding-your-own-packages)に従い
Availableの下にフィードを追加し、Sourceに先程のパッケージフォルダを指定。
　![feed.png](https://qiita-image-store.s3.amazonaws.com/0/255097/027b28c3-edf9-d614-2dd4-1b09e3ae698d.png)

出た！
　![testactivity.png](https://qiita-image-store.s3.amazonaws.com/0/255097/d9e280cd-ecaf-913b-74a9-e7eca545a8ee.png)

早速インストールすると…なるほどツリーのトップレベルに追加されるのね。
　![list.png](https://qiita-image-store.s3.amazonaws.com/0/255097/6d04192f-a612-cbcd-9751-54e531d0d238.png)

ワークフローに置いてみた。確かにコードの通りのプロパティが表示されている。
　![activity.png](https://qiita-image-store.s3.amazonaws.com/0/255097/fe34d4a1-1f29-e652-44e5-0ffce7981a2d.png)

アイコンとかフローに置いた時の見た目とか、他に色々とカスタマイズできそうです。

<br><br>
これは・・・この設定は・・・**燃える！！熱いぞ！**
UiPathに**自分が設計し自分が開発した**アクティビティが追加できる！そして**自分で使える**！
つまり**ロボットに自分だけのオリジナルの機能や武装を追加し自分で使いこなす**という、まさに
超戦士ガンダム野郎やダッシュ四駆郎といったボンボンコロコロのホビー漫画で育った我々にとって
その熱いスピリットの行き場がここにある、という事だ！

気分が高まって太字ばかりになってしまった。

# まとめ
最後に、ソースコード／NuGetプロパティ／パッケージ／アクティビティの関係を図にしました。
![relation.png](https://qiita-image-store.s3.amazonaws.com/0/255097/90520a01-fb23-e6ab-a70d-3c232bfc6f40.png)

---
今回はここまで。
UiPathのカスタムアクティビティは世に出回っている事例や参考になるサイトがまだ少ないのですが、[UiPathのGitHub](https://github.com/UiPath/Community.Activities)にもいくつかサンプルコードが載っているので、少しずつ勉強してTips等を紹介できたらと思います。

次回＞ [カスタムアクティビティのアイコンを変更する](https://qiita.com/UmegayaRollcake/items/4fe69c00e82402cc478b)