RPA之PAD(Power Automate Desktop)元件開發

RPA之PAD(Power Automate Desktop)元件開發

只要有一扇門,就會有一個世界,現在已經有一扇門

最後更新 2022/5/30 下午9:24
蓝创精英团队
預計閱讀 9 分鐘
分類
.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,另一種是程式碼簽章,兩者不同,不能混用。

大致目錄如下:

最簡單的 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 類別的名稱不同,這樣顯示起來會比較方便。

元件內容的顯示大致規則

透過對「元件名稱」或「類型」以及「類別屬性」分割。

加入

  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 就會自帶。

當然,我也會把工具提供出來。

一個簽章的批次檔(預設簽章密碼為 123456

基本上只需要這兩個組件進行簽章,其他引用的 NuGet 套件則不需要。

主要是 YZG.Modules.HelloWorld.Actions.dllzh-Hans\YZG.Modules.HelloWorld.Actions.resources.dll,把它們放到簽章的位置

雙擊批次檔進行簽章

這樣就簽章成功了。另外在 DLL 上按右鍵,可以看到簽章資訊。

在目標電腦上安裝憑證

如果你的憑證是花錢買的,自然就不用安裝了,會直接被認可。否則還是要安裝憑證。

安裝憑證非常簡單,直接雙擊,輸入密碼,然後選擇指定的位置即可。

直接按「下一步」

下一步

選擇「受信任的根憑證授權機構」

然後按「完成」,是否匯入?選「是」、「確定」即可。

輸入 CMD 指令(certmgr.msc)就可以看到指定群組下就有你的憑證了。

至此,憑證安裝完畢。

元件部署

前提:應用服務要關閉

否則 DLL 會被佔用。

然後,把簽章後的專案放入到安裝目錄下的指定外掛目錄中,大致如下所示。

另外,我這是 C 槽,還有權限的問題需要注意,最好是安裝到其他磁碟

然後執行 PAD 應用程式,新增一個工作流程,或是編輯任一個工作流程。

如果出現以下問題,那就是憑證沒有安裝到目標電腦,安裝一下即可。

然後,正常情況下,開啟 PAD 的設計檢視,會如下所示:

已經新增了一個功能「測試案例 -> 打招呼」,並新增了一個功能。

我們試一下

儲存後如下所示

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

問題處理

  • 第一,中文不顯示的問題,建議加入中文語言套件,裡面的名稱要與程式碼相符,具體可參考範例。
  • 第二,載入不出來、提示錯誤,可以根據錯誤訊息修改,或加入缺少的參考套件。
  • 第三,更多細節只能多挖掘和嘗試了。

擴充元件的參數資訊

我這邊根據網友(潘淳)的總結以及自己的總結,也輸出一個這樣的文件出來。

ActionBase 需要的相關參數

以及內建的相關類型

這裡也感謝潘淳前輩的總結。

完結

完結撒花,寫這個還真不容易,特別是 PAD 在辨識你的元件時,會出現各種各樣的問題。

這時候就要重試好多次、好多次。

不過還好,我已經基於這個可擴充的元件,寫了一個 Sqlite 的元件,也會發佈到範例中,供前輩們參考。

參考資料

https://github.com/kesshei/PADDemo

繼續探索

延伸閱讀

更多文章