RPAのPAD(Power Automate Desktop)コンポーネント開発

RPAのPAD(Power Automate Desktop)コンポーネント開発

ドアがあれば世界がある、今そのドアがある

最終更新 2022/05/30 21:24
蓝创精英团队
読了目安 6 分
カテゴリ
.NET
タグ
.NET C# RPA

本記事はネットユーザー「蓝创精英团队」による寄稿です。転載・共有は自由です

原文著者:蓝创精英团队

原文リンク:https://blog.csdn.net/i2blue/article/details/125040323


実は、PAD では、現在公式ドキュメントにコンポーネントベースやプラグインベースの開発インターフェースはまだ公開されていません。

しかし、志を同じくする仲間、例えば(潘淳)潘総大佬が RPA 分野で非常に優れた活躍をされています。

扉があれば、そこに世界が広がります。すでに一つの扉は存在しています(何しろ .NET Framework ですから、研究して参考にすることは容易です)。

コンポーネント開発環境

デフォルトのコンポーネント配置場所は、現在のアプリケーションの以下のディレクトリです。

C:\Program Files (x86)\Power Automate Desktop\custom-modules

アプリケーションのパスはご自身の環境に合わせてください。

また、プラグインの DLL はコード署名が必要です。

デフォルトでは個人署名を使用し、システムの「信頼されたルート証明機関」に配置すれば問題ありません。

予算があれば、コード署名証明書を購入しても構いません。

現時点では、他に良い方法は見つかっていません。署名には大きく分けてドメイン証明書 SSL とコード署名の2種類があり、これらは異なるため混在できません。

ディレクトリ構成の概要は以下の通りです。

最もシンプルなデモ

開発の流れに沿って一通り試し、最後にまとめます。

空のソリューションを作成する

デフォルトで新しいソリューション(空のソリューション)を作成します。

コンポーネントライブラリを追加する

コンポーネント DLL の名前は以下のルールを満たす必要があります。

"?*.Modules.?*.dll",
"Modules.?*.dll"

公式のコンポーネントパッケージは以下のような形式です。

Microsoft.Flow.RPA.Desktop.Modules.System.Actions.dll

そこで、私も公式の標準に従います。

名前は YZG.Modules.HelloWorld.Actions とします(注意:demo や test などの名前は認識されない問題が発生する可能性があるため、特殊な名前を推奨します)。

挨拶コンポーネントプロジェクト

デフォルトのソリューションは挨拶から始めます。

開発 DLL パッケージを参照する

次に、インストールディレクトリ C:\Program Files (x86)\Power Automate Desktop にある以下の DLL パッケージを参照します。

Microsoft.Flow.RPA.Desktop.Modules.SDK.dll
 Microsoft.Flow.RPA.Desktop.Modules.SDK.Extended.dll

もちろん、使用中に必要なパッケージがあれば、適宜追加で参照してください。

参照を追加した結果は以下の通りです。

挨拶のロジックを追加する

以下が全ロジックコードです。

[Action(Id = "SayHello")]
[Icon(Code = "EFF7")]
[Throws("MyError")]
public class SayHello : ActionBase
{
    [InputArgument]
    public string UserName { get; set; }

    [OutputArgument]
    public string Result { get; set; }
    public override void Execute(ActionContext context)
    {
        try
        {
            this.Result = $"{UserName} 你好,中国欢迎你! -{DateTime.Now}";
        }
        catch (ActionException ex)
        {
            throw new ActionException("MyError", ex.Message, ex.InnerException);
        }
    }
}

国際化対応を追加する

外国語対応は不要で、中国語対応のみ追加すれば十分です。

まず、中国語のリソースファイルを追加します(公式のパスにある言語パッケージを参照して内部構造を分析することも可能です)。

コンポーネント表示の基本ルール

コンポーネントの名前はどこから来るのでしょうか。

アセンブリ情報の AssemblyTitle から取得されます。この名前はデフォルトで英語ですが、ローカライズも可能です。

また、この名前はコンポーネントの Action 名と異なる方が表示上好ましいです。

コンポーネント内容表示の基本ルール

コンポーネント名 または タイプクラスプロパティ で分割します。

以下の項目を追加します。

  1. _FriendlyName
  2. _Description
  3. _Summary

FriendlyName は各コンポーネントのメイン名、Description は説明文、Summary はキー情報で、役割は明確です。内部では テンプレートエンジン変数 < プロパティ名大文字 > を使用して動的に情報を表示します。

サンプルは以下の通りです。

Close_Connection_Description = "新 SQL 连接的句柄"
Close_Connection_FriendlyName = "SQL 连接"
Close_Description = "关闭与数据库的开放连接"
Close_FriendlyName = "关闭 SQL 连接"
Close_Summary = "关闭 SQL 连接 <CONNECTION>"
ConnectAndExecute_Description = "连接到数据库并执行 SQL 语句"
ConnectAndExecute_Summary = "<if(RESULT)>\r\n执行 SQL 语句 <STATEMENT> 并将查询结果存储到 <RESULT> 中<else>\r\n执行 SQL 语句 <STATEMENT><endif>"
Connect_ConnectionString_Description = "用于连接到数据库的连接字符串"
Connect_ConnectionString_FriendlyName = "连接字符串"
Connect_Connection_Description = "新 SQL 连接的句柄"
Connect_Connection_FriendlyName = "SQL 连接"
Connect_Description = "打开与数据库的新连接"
Connect_FriendlyName = "打开 SQL 连接"
Connect_Summary = "<if(CONNECTION)>\r\n打开 SQL 连接 <CONNECTIONSTRING> 并将其存储到 <CONNECTION> 中<else>\r\n打开 SQL 连接 <CONNECTIONSTRING><endif>"
Database_Description = "连接到数据库并执行 SQL 语句"
Database_FriendlyName = "数据库"
ErrorMessage_CannotConnect = "无法连接到数据源"
ErrorMessage_CannotConnectError = "无法连接到数据源 {0}"
ErrorMessage_InvalidConnectionString = "连接字符串无效"
ErrorMessage_StatementError = "SQL 语句中的错误 {0}"
ErrorMessage_UniniatializedConnection = "SQL 连接未初始化。请仔细检查是否已指定正确的 SQL 连接,且该连接在“打开 SQL 连接”之后(而不是在已关闭该连接之后)使用"
Error_ConnectToDataSourceError_Description = "指示连接到数据源时出现问题"
Error_ConnectToDataSourceError_FriendlyName = "无法连接到数据源"
Error_InvalidConnectionStringError_Description = "指示指定的连接字符串无效"
Error_InvalidConnectionStringError_FriendlyName = "连接字符串无效"
Error_SqlStatementError_Description = "指示给定的 SQL 语句中存在错误"
Error_SqlStatementError_FriendlyName = "SQL 语句中的错误"
ExecuteSqlStatement_ConnectionString_Description = "用于连接到数据库的连接字符串"
ExecuteSqlStatement_ConnectionString_FriendlyName = "连接字符串"
ExecuteSqlStatement_Connection_Description = "新 SQL 连接的句柄"
ExecuteSqlStatement_Connection_FriendlyName = "SQL 连接"
ExecuteSqlStatement_Description = "连接到数据库并执行 SQL 语句"
ExecuteSqlStatement_FriendlyName = "执行 SQL 语句"
ExecuteSqlStatement_GetConnection_Description = "指定是从给定连接字符串创建新连接,还是选择已打开的连接"
ExecuteSqlStatement_GetConnection_FriendlyName = "获取连接的方式"
ExecuteSqlStatement_Result_Description = "来自数据库的结果,采用数据表的形式,包含行和列"
ExecuteSqlStatement_Result_FriendlyName = "查询结果"
ExecuteSqlStatement_Statement_Description = "要对数据库执行的 SQL 语句"
ExecuteSqlStatement_Statement_FriendlyName = "SQL 语句"
ExecuteSqlStatement_Timeout_Description = "等待来自数据库的结果的最长时间"
ExecuteSqlStatement_Timeout_FriendlyName = "超时"
Execute_Description = "连接到数据库并执行 SQL 语句"
Execute_Summary = "<if(RESULT)>\r\n对 <CONNECTION> 执行 SQL 语句 <STATEMENT> 并将查询结果存储到 <RESULT> 中<else>\r\n对 <CONNECTION> 执行 SQL 语句 <STATEMENT><endif>"
GetSQLConnectionBy_ConnectionString_FriendlyName = "连接字符串"
GetSQLConnectionBy_SQLConnectionVariable_FriendlyName = "SQL 连接变量"
Message_SqlConnection = "SQL 连接"
SqlConnectionHandle_FriendlyName = "SQL 连接"
SqlConnectionHandle_FriendlyNamePlural = "SQL 连接"

上記の情報を参考に、挨拶プログラムに中国語の内容を追加します。

実際の中国語内容

以下の項目を追加しました。

コンポーネントプロジェクトに署名を追加する

予算があればコード署名証明書を購入し、ない場合は以下の一時的な自己発行証明書を使用します。

一時証明書を作成する

新しい署名を作成します(VS は管理者モード、つまり管理者として起動してください)。

すると、署名用の pfx ファイルが作成されます。

コンポーネント DLL に署名する

ここでは signtool.exe を使用します。VS がインストールされていれば自動で利用可能です(必要に応じて提供も可能です)。

署名用の bat スクリプト(デフォルトの署名パスワードは 123456

基本的にこれらの2つのアセンブリに署名するだけで、参照している NuGet ライブラリは不要です。

主に YZG.Modules.HelloWorld.Actions.dllzh-Hans\YZG.Modules.HelloWorld.Actions.resources.dll を署名用の場所に配置します。

bat をダブルクリックして署名を実行します。

これで署名が成功しました。DLL を右クリックすると署名情報が確認できます。

ターゲットマシンに証明書をインストールする

有料の証明書であればインストールは不要です(自動的に信頼されます)。それ以外の場合は証明書をインストールする必要があります。

証明書のインストールは非常に簡単です。ダブルクリックし、パスワードを入力し、適切な場所を選択するだけです。

そのまま次へ

次へ

「信頼されたルート証明機関」を選択

完了をクリックし、「はい」で確定します。

CMD で certmgr.msc を実行すると、指定したグループに証明書が表示されます。

これで証明書のインストールは完了です。

コンポーネントのデプロイ

前提として、アプリケーションサービスを終了しておく必要があります。

そうしないと DLL がロックされます。

次に、署名済みのプロジェクトをインストールディレクトリの指定プラグインディレクトリに配置します。概要は以下の通りです。

なお、これが C ドライブの場合、権限の問題が発生する可能性があるため、可能であれば他のドライブにインストールすることをお勧めします。

その後、PAD アプリケーションを起動し、新しいタスクフローを作成するか、任意のタスクフローを編集します。

以下の問題が発生した場合は、証明書がターゲットマシンにインストールされていないため、インストールしてください。

通常、PAD のデザインビューを開くと、以下のように表示されます。

新たに「テストケース -> 挨拶」という機能が追加され、新しいアクションが使用可能になりました。

試してみましょう。

保存後の状態は以下の通りです。

最後に、実際の動作を確認できます。非常に良い感じです。

問題の対処

  • 1つ目:中国語が表示されない問題。中国語の言語パックを追加し、その中の名前がコードと一致していることを確認してください。具体的にはサンプルを参照してください。
  • 2つ目:読み込めない、エラーが表示される問題。エラーメッセージに従って修正するか、不足している参照パッケージを追加してください。
  • 3つ目:その他の詳細については、さらに掘り下げて試行錯誤する必要があります。

コンポーネントのパラメータ情報の拡張

ネットユーザー(潘淳)のまとめと自身のまとめに基づき、以下のドキュメントを作成しました。

ActionBase に必要な関連パラメータ

および組み込みの関連型

潘淳大佬のまとめにも感謝します。

完了

完了です、パチパチ。この記事を書くのは本当に大変でした。特に PAD がコンポーネントを認識する際に、さまざまな問題が発生しました。

そのため、何度も何度も試行錯誤が必要でした。

しかし、この拡張可能なコンポーネントをベースに、Sqlite コンポーネントを作成しました。サンプルとして公開しますので、大佬方の参考になれば幸いです。

参考リンク

https://github.com/kesshei/PADDemo

さらに探索

関連読書

その他の記事
同じカテゴリ / 同じタグ 2026/04/22

各OSバージョンの.NETサポート状況(250707更新)

仮想マシンとテストマシンを使用して、各OSバージョンの.NETサポート状況を確認します。OSインストール後、対応するランタイムをインストールし、Stardustエージェントを実行できることを確認します(合格条件)。

続きを読む