本文由網友
藍創精英團隊
投稿,歡迎轉載、分享原文作者:藍創精英團隊
原文鏈接: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.dllMicrosoft.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);}}
}
增加國際化支持
也不用增加外語,直接增加中文支持就可以了
首先,我們增加一個中文的資源文件(另外可以參考官網路徑下的語言包來看內部結構分析)
下圖幀數大于300(重新錄制部分,有興趣查看原文看完整gif)
組件顯示大致規則
組件的名字從哪里來
是從程序集信息里的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的設計視圖,會如下所示:

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

保存后如下所示

最后,可以看下實際的動作,效果很不錯的說(原圖超過300幀,微信限制,重新錄制了部分,有興趣請看原文)。
問題處理
第一,中文不顯示的問題,建議增加中文語言包,里面的名字要跟代碼相匹配,具體可以參考示例。
第二,加載不出來,提示錯誤,可以根據錯誤提示修改,或者添加缺失的引用包。
第三,更多細節,只能多挖掘和嘗試了
擴展組件的參數信息
我這邊根據網友(潘淳)的總結以及自己的總結,也輸出一個這樣的文檔出來。
ActionBase 需要的相關參數

以及內置的相關類型

這里也感謝潘淳大佬的總結
完結
完結撒花,寫這個還真不容易,特別是PAD,識別你的組件的時候,會有各種各樣的問題。
這個時候就要重試好多遍,好多遍。
不過還好,我已經基于這個能擴展的組件,寫了一個Sqlite的組件。也會發到示例了。供大佬們參考。
引用
https://github.com/kesshei/PADDemo