本記事はネットユーザー「蓝创精英团队」による寄稿です。転載・共有は自由です
原文著者:蓝创精英团队
原文リンク: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 名と異なる方が表示上好ましいです。
コンポーネント内容表示の基本ルール
コンポーネント名 または タイプ、クラスプロパティ で分割します。
以下の項目を追加します。
_FriendlyName_Description_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.dll と zh-Hans\YZG.Modules.HelloWorld.Actions.resources.dll を署名用の場所に配置します。

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

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

ターゲットマシンに証明書をインストールする
有料の証明書であればインストールは不要です(自動的に信頼されます)。それ以外の場合は証明書をインストールする必要があります。
証明書のインストールは非常に簡単です。ダブルクリックし、パスワードを入力し、適切な場所を選択するだけです。

そのまま次へ

次へ

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


完了をクリックし、「はい」で確定します。
CMD で certmgr.msc を実行すると、指定したグループに証明書が表示されます。
これで証明書のインストールは完了です。
コンポーネントのデプロイ
前提として、アプリケーションサービスを終了しておく必要があります。

そうしないと DLL がロックされます。
次に、署名済みのプロジェクトをインストールディレクトリの指定プラグインディレクトリに配置します。概要は以下の通りです。
なお、これが C ドライブの場合、権限の問題が発生する可能性があるため、可能であれば他のドライブにインストールすることをお勧めします。

その後、PAD アプリケーションを起動し、新しいタスクフローを作成するか、任意のタスクフローを編集します。
以下の問題が発生した場合は、証明書がターゲットマシンにインストールされていないため、インストールしてください。

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

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

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

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

問題の対処
- 1つ目:中国語が表示されない問題。中国語の言語パックを追加し、その中の名前がコードと一致していることを確認してください。具体的にはサンプルを参照してください。
- 2つ目:読み込めない、エラーが表示される問題。エラーメッセージに従って修正するか、不足している参照パッケージを追加してください。
- 3つ目:その他の詳細については、さらに掘り下げて試行錯誤する必要があります。
コンポーネントのパラメータ情報の拡張
ネットユーザー(潘淳)のまとめと自身のまとめに基づき、以下のドキュメントを作成しました。
ActionBase に必要な関連パラメータ


および組み込みの関連型

潘淳大佬のまとめにも感謝します。
完了
完了です、パチパチ。この記事を書くのは本当に大変でした。特に PAD がコンポーネントを認識する際に、さまざまな問題が発生しました。
そのため、何度も何度も試行錯誤が必要でした。
しかし、この拡張可能なコンポーネントをベースに、Sqlite コンポーネントを作成しました。サンプルとして公開しますので、大佬方の参考になれば幸いです。