RPA之PAD(Power Automate Desktop)组件开发

Power Automate Desktop 组件开发

其实,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的名字不一致。这样,显示会方便点

组件内容的显示大致规则

通过对 组件名 或者 类型 以及 类属性 分割。
增加

  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)
在这里插入图片描述
在这里插入图片描述
基本只需要这两个程序集进行签名,其他的,引用的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的组件。也会发到示例了。供大佬们参考。

引用

https://github.com/kesshei/PADDemo

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝创精英团队

你的支持是我最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值