Visual C++ で開発した DLL ファイルを UiPath Studio から利用する方法

:white_question_mark: Question

Visual C++ で開発した DLL ファイルを UiPath Studio から利用する方法を教えてください。

:light_bulb: Answer

解決策

Visual C++ で開発した DLL ファイルは「コード化されたワークフロー」でインポートして DLL ファイル内で定義した関数を利用することができます。なお、下記ガイドに記載の通り「コード化されたワークフロー」では C# でコーディングする必要があります。

構造
コード化されたオートメーションは、名前空間、ヘルパー クラス、およびエントリ ポイントのメソッドを使用した構造化されたデザインを特徴とします。
コード化されたオートメーションのフレームワークを使用すると、C# プログラミング言語を使用してオートメーションを記述できます。

例として Visual C++ では下記の通り、フォーマットされた日時文字列データを返すシンプルなコードを利用しています。

// dllmain.cpp
#include "pch.h"
#include "dllmain.h"
#include <ctime>
#include <string>

BOOL APIENTRY DllMain( HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

extern "C" __declspec(dllexport) const char* GetCurrentDateTime()
{
    // 静的バッファを確保
    static char dateTimeStr[20];

    // 現在の日時を取得
    time_t now = time(nullptr);
    struct tm localTime;
    localtime_s(&localTime, &now);

    // yyyyMMdd-HHmmss 形式の文字列
    strftime(dateTimeStr, sizeof(dateTimeStr), "%Y%m%d-%H%M%S", &localTime);

    return dateTimeStr;
}

下記はヘッダーファイルです。

// dllmain.h
#pragma once
extern "C" __declspec(dllexport) const char* GetCurrentDateTime();

下記手順に沿って実装をお試しください。

  1. DLL ファイルを利用したいオートメーションプロジェクトを UiPath Studio で開いて、画面左側の「プロジェクト」パネルへコピーした DLL ファイルを貼り付けます。下図例では DLL ファイル「UiPathTestDynamicLinkLibrary.dll」を貼り付けています。

  1. 画面左側の「プロジェクト」パネルを右クリックして「追加」→「コード化されたワークフロー」をクリックします。

  1. 画面中央に表示された「新しいコード化されたワークフロー」の「名前」を入力して「作成」をクリックします。下図例では「CodeWorkflow」と入力しています。

  1. コード化されたワークフローファイル「CodeWorkflow.cs」が表示されるので、画面上部の「using」と表示されている次行に「using System.Runtime.InteropServices;」を追加します。

  1. 「puclic class」内に DLL ファイルをインポートするための処理を下記のように記載します。DLL ファイル名とインポートしたい関数は環境に合わせて変更します。
// C++ の DLL 関数をインポート
[DllImport("UiPathTestDynamicLinkLibrary.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr GetCurrentDateTime();

  1. メインの処理である「public string Execute()」内にインポートした関数を利用した処理を記載します。下記の例では実行した結果を別のワークフローで利用できるように文字列型データを返します。
[Workflow]
public string Execute()
{
    IntPtr ipDt = GetCurrentDateTime();
    string strDt = Marshal.PtrToStringAnsi(ipDt); // 文字列を変換
    Console.WriteLine("DateTime : " + strDt);
    return strDt;
}

  1. コード化されたワークフローファイル「CodeWorkflow.cs」の動作確認をおこないます。下図例では問題なくフォーマットされた日時文字列データが取得できることを確認しています。

  1. 「Main.xaml」などのワークフローから利用するには『ワークフローファイルを呼び出し』アクティビティを利用します。配置してプロパティ「ワークフローファイル名」でコード化されたワークフローファイル「CodeWorkflow.cs」が表示されることを確認して選択します。

  1. 『ワークフローファイルを呼び出し』アクティビティのプロパティ「Output」に事前に定義した文字列型変数を設定して実行し、コード化されたワークフローファイル「CodeWorkflow.cs」の実行結果が「Main.xaml」で利用できることを確認します。下図例では文字列型変数を「strOutput」と定義して利用しています。