本文由网友
蓝创精英团队投稿,欢迎转载、分享原文作者:藍創精英團隊
原文連結:https://blog.csdn.net/i2blue/article/details/125040323
其實,pad,現在官方文檔還沒有對外組件式或者插件式開發接口。
但是,有一些志同道合的朋友,比如(潘淳),潘總大佬,在 rpa 領域,還是很牛逼的。
只要有一扇門,就會有一個世界,現在已經有了一扇門(畢竟是.net framework,那麼,研究借鑑就容易多了)。
組件開發環境
默認組件的位置是在當前應用下的這個目錄
C:\Program Files (x86)\Power Automate Desktop\custom-modules
應用地址,按照你自己的來。
另外,插件的 dll,是需要 dll 代碼簽名了。
默認採用個人簽名,放到系統 受信任的根證書頒發機構 即可。
如果有錢,可以買個代碼簽名。
目前,我這邊還沒別的好的方式,其中,簽名大致分為兩種,一種是域名證書 ssl,和 代碼簽名,它們之間是不一樣的,不能混用。
大致目錄如下:

最簡單的 demo
準備直接按照開發流程走一遍,最後,再總結。
新建空白解決方案
默認新增一個解決方案(空的解決方案)

新增組件庫
組件 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)


基本只需要這兩個程式集進行簽名,其他的,引用的 nuget 庫是不需要的。
主要是YZG.Modules.HelloWorld.Actions.dll和zh-Hans\YZG.Modules.HelloWorld.Actions.resources.dll放到签名的地方

雙擊 bat 進行簽名

這樣就簽名成功了。另外在 dll 上右鍵,是能看到簽名信息的。

目標機器上安裝證書
如果你的證書是掏錢買的,自然就不用安裝了。直接被認可的。否則,還是要安裝證書的。
安裝證書,非常的簡單,直接雙擊,輸入密碼,然後,選擇指定的位置即可。

直接下一步

下一步

選擇受信任的根證書頒發機構


然後,完成,是否導入,是,確定,即可。
输入 CMD 命令( certmgr.msc ) 就可以看到指定分组下就有你的证书了。
至此,證書安裝完畢。
組件部署
前提,應用服務要退出,

要不然,dll 會被占用。
然後,把簽名後的項目放入到安裝目錄下的指定插件目錄里大致如下所示。
另外,我這個是 c 盤,還有一個權限的問題。需要注意,能安裝到其他盤最好。

然後,運行 pad 應用,新建一個任務流,或者編輯任意一個任務流。
如果出現以下問題,那就是證書沒有安裝到目標機器,安裝一下就好。

然後,正常情況下,打開 pad 的設計視圖,會如下所示:

已經新增了一個功能 測試案例 -> 打招呼 並新增了一個功能。
我們試一下

保存後如下所示

最後,可以看下實際的動作,效果很不錯的說。

問題處理
- 第一,中文不顯示的問題,建議增加中文語言包,裡面的名字要跟代碼相匹配,具體可以參考示例。
- 第二,加載不出來,提示錯誤,可以根據錯誤提示修改,或者添加缺失的引用包。
- 第三,更多細節,只能多挖掘和嘗試了
擴展組件的參數信息
我這邊根據網友(潘淳)的總結以及自己的總結,也輸出一個這樣的文檔出來。
actionbase 需要的相關參數


以及內置的相關類型

這裡也感謝潘淳大佬的總結
完結
完結撒花,寫這個還真不容易,特別是 pad,識別你的組件的時候,會有各種各樣的問題。
這個時候就要重試好多遍,好多遍。
不過還好,我已經基於這個能擴展的組件,寫了一個 sqlite 的組件。也會發到示例了。供大佬們參考。