Automation Anywhere A2019 でDLLをロジックとして使う (※ただし文字列型引数に日本語文字があると現状NG)

# 概要
前のバージョンであるv11では、ロボットの部品を作成するのにMetaBotという仕組みがありましたが、A2019では廃止され、代わりにいくつかの代替手段が用意されています。MetaBotの中でDLLを呼んでいたものについては、A2019のTaskBotから直接DLLを呼べる**「DLL」パッケージ**が用意されましたので、今回はこれを使ってDLLのロジックをA2019でも活用してみたいと思います。

**利用環境**

* Automation Anywhere A2019.10 (ビルド2545)
* Microsoft Visual Studio Community 2019 v16.4.5 (.NET Framework 4.7.2) - DLL開発環境

# DLL の準備
準備するDLLは『[Automation AnywhereでMetaBotを作成する](https://qiita.com/RPAbot/items/4271858e2c11d80b31f6)』の記事で扱ったものです。一応、念のため繰り返し記載します。

DLLは.NET プログラミング言語 (C#) で開発したもののみがサポートされます。以下の手順に従って、Visual Studioで作成します。

1. Visual Studio Community 2019を開き、「新しいプロジェクトの作成」で「DLL」と検索して「クラスライブラリ (.NET Framework)」(C#) を選び、新しいプロジェクトを作成開始します。<br/>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/85cd0253-5c90-720c-05eb-2145e95d4cb4.png)
2. プロジェクト名/ソリューション名「JapaneseLibrary」で新規作成すると、IDEが開きます。<br/>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/cb9d595e-d2f0-a8b0-084f-b3951a7bd1f5.png)
3. IDEの「プロジェクト」-「参照の追加」で「Microsoft.VisualBasic」を追加します。<br/>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/518d5088-f02a-0c42-5457-f79e2d8d1472.png)

Class1.csをJpnLib.csに名前を変更して、以下の内容にします。

```CSharp:JpnLib.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.VisualBasic;

namespace JapaneseLibrary
{
    public class BotMthods
    {
        public String HiraganaToKatakana(String inputString)
        {
            return Strings.StrConv(inputString,VbStrConv.Katakana);
        }
        public String KatakanaToHiragana(String inputString)
        {
            return Strings.StrConv(inputString, VbStrConv.Hiragana);
        }
    }
}
```

4.ソリューションをビルドしてJapaneseLibrary.dllを作成します。

# A2019でDLLパッケージを使う
さて、用意したDLLをA2019から呼び出すBotを作成しましょう。A2019でBotを新規作成したら、アクションパレットで**「DLL」パッケージ**を探してみましょう。中には**Open、Run Function、Close**の3つのアクションが含まれていますので、それぞれをドラッグ＆ドロップして、以下の画像のようにOpen、Run Function、Closeの順番で配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/4d8900ab-5a7e-1941-0844-32060f896a2d.png)

あらかじめディクショナリ変数を以下のように用意しておきます。(関数に渡す引数として使います)

* 名前: Arguments
* タイプ: ディクショナリ
* サブタイプ: 任意
* 1つ目の要素
    * タイプ: 文字列
    * キー: inputString
    * 値: あいうえおアイウエオ本日は晴天ナリ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/fcce9157-9c28-4b33-3997-5958163e1c02.png)


それぞれのアクションには次の値をフィールドに入れていきます。

**DLL: Open**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/7ac36ce7-a0a4-bd16-febe-19c337f08b02.png)
"File path"は「参照」ボタンをクリックして、表示されるダイアログボックスで「ファイルをアップロード」を選択、ローカルPCからJapaneseLibrary.dllをアップロードします。DLLは常にControl Roomのリポジトリに格納され、必要に応じて再度ローカルPCにダウンロードして利用されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/79f4b222-89fc-4ff5-57e1-b88b8897db73.png)


**DLL: Run Function**
DLLの中のnamespace名、class名、関数名、引数を格納しているディクショナリ型変数 (`$Arguments$`)および出力の格納先変数 (文字列: `$prompt-assignment$`)を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/6b1427bc-82c0-4bc1-b5b6-d29fe6ef5e70.png)

>注: v11の時のようにDLLを指定して中に格納されているnamespace一覧、class一覧、関数一覧を見る機能がA2019だとありません。これらの名前はあらかじめ入手しておく必要があります。既存のMetaBotの中に入っているDLLでこれらが不明なものは、v11の環境があればMetaBot Designerで一度覗いてみて確認する必要がありそうです。


**DLL: Close**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/de68e924-5ceb-8897-b153-31650aeec8bf.png)
特に変更する必要はありません。

アクションリストの最後に、結果が格納された変数`$prompt-assignment$`を表示するメッセージボックスアクションを挿入して完成です。

### 実行結果
返された文字列は日本語がおかしな感じになっていました...「bot error」という文字列になることもありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/a22197f7-65ab-b7b0-c30a-65554b7d1baf.png)

>メモ: いろいろとデバッグをしていると、inputStringに日本語文字を代入する場合に結果がエラーになったりおかしな文字列を返すことがわかりました。たとえば`HiraganaToKatakana`の関数の中の

```CSharp:
return Strings.StrConv(inputString,VbStrConv.Katakana);
```
>を

```CSharp:
return Strings.StrConv(inputString,VbStrConv.Katakana).ToUpper;
```
>に変更してビルドしたDLLを使った場合、inputStringに半角英数字のみの「abcde」などを入力すると正しく「ABCDE」と帰ってきます。このことからDLLパッケージの現時点でのバグとして、入力用引数に日本語文字を設定した場合に正しく引き渡されないというものがあると思われます。ただ、日本語文字が絡まなければ現時点でもきちんと動作するようです。

# まとめ
いかがでしたでしょうか。A2019では直接DLLの中の関数を呼べるようになったので、必要なロジックをDLLに外出しにしてC#で開発することも可能です。(ただし現時点では日本語文字を扱えないバグがありますが)

それではまた！