一、需要了解的一些情况
1、据肉眼观察Uipath的实现基于微软的Windows Workflow Foundation
2、Windows Workflow Foundation 支持用户自定义控件, Uipath同理
3、Uipath官方支持Nuget格式的自定义控件包
二、开发需要的工具
1、Visual Studio: 开发工具
2、NuGet Package Manager: 打包工具
3、UiPath Studio: 实际运行环境
三、动动手
Uipath支持CodeActivity和NativeActivity两种类型的控件。
简单的区别:
-
- CodeActivity: 没有交互界面,适用简单的逻辑。
- Native Activity: 包含 Code Activity 一切功能并且有交互界面,适用复杂逻辑。
1、创建一个CodeActivity
使用 VS 创建一个 Class Library (.NET Framework)项目, 命名为: XXXXX.Exception
Uipath 根据项目名称解析成展示名称, 名称中包含 ’.’ 会被解析成子级目录。
Uipath控件列表
项目需要添加的引用: System.Activities, System.ComponentModel.Composition
以下为控件代码实现,示例逻辑为返回一段自定义内容格式的异常
using System; using System.Activities; using System.Activities.Hosting; using System.ComponentModel; using System.Reflection; using System.Text; namespace YourNamespace { //描述在Uipath中显示的控件名称 [DisplayName("Throw Business Exception")] public class ThrowBusinessException : CodeActivity { //Category("*") 描述当前变量出现在属性栏的位置 [Category("Input")] //添加RequiredArgument注解意味是必填项,缺失参数会在页面提示错误 [RequiredArgument] //InArgument<T> 为入参类型 public InArgument<string> Message { get; set; } [Category("Output")] //OutArgument<T> 为出参类型 public OutArgument<string> OutMessage { get; set; } protected override void Execute(CodeActivityContext context) { //通过反射获取调用控件的父级控件 PropertyInfo parentObj = this.GetType().GetProperty("Parent", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); string parentName = parentObj.GetValue(this, null).ToString(); Console.WriteLine("Parent name:" + parentName); #region 不必要的代码 //获取执行控件的文件名 WorkflowInstanceProxy proxy = context.GetExtension<WorkflowInstanceInfo>().GetProxy(); Activity workflowDefinition = proxy.WorkflowDefinition; string workflowName = workflowDefinition.DisplayName; Console.WriteLine(workflowName); #endregion //Make Error Information StringBuilder throwStr = new StringBuilder(); throwStr.Append("{"); throwStr.Append(string.Format("'DateTime':'{0}',", DateTime.Now.ToString())); throwStr.Append(string.Format("'FileName':'{0}',", workflowName)); throwStr.Append(string.Format("'ParentActivity':'{0}',", parentName)); throwStr.Append(string.Format("'Message':'{0}'", Message.Get(context))); throwStr.Append("}"); //IL_000d: Unknown result type (might be due to invalid IL or missing references) //throw new BusinessRuleException(throwStr.ToString()); throw new System.Exception(throwStr.ToString()); } protected override void CacheMetadata(CodeActivityMetadata metadata) { base.CacheMetadata(metadata); //不必要的代码,这里的作用是为了获取当前文件名 metadata.AddDefaultExtensionProvider(() => new WorkflowInstanceInfo()); } } }
2、使用 NuGet Package Explore 打包:
打开 NuGet Package Explore,选择 Create a new package
右键Package contents 空白处, 选择Add Lib Folder
右键Lib文件夹, 选择Add Existing File, 添加编译好的 .dll文件
※编辑Package metadata信息
--- Id: 包名, Uipath规则规定, 包名中一定要包含Activities字样否则不做控件包识别
---Version: 版本号, 每次更新打包必须更新版本号, 否则Uipath不会重新加载也不会更新该包
选择 File => Save as, 保存包, 完成。
3、Uipath如何添加自定义包
方式一:Uipath默认会映射一个本地包文件夹,路径为Uipath的安装目录下的Packages,手动Copy包到本地文件包路径。
方式二:手动映射一个本地包文件夹,通过Uipath Studio提供的Manage Packages=> Settings功能设置,将包Copy到该路径下即可。
方式三:上传到Uipath Go 或者其它包管理平台(可在Manage Packages中配置),然后在Manage Packages中搜索即可。
四、 补充说明
1、Native Activity稍微复杂另起一篇再叙。
2、自定义控件是封闭空间中的一扇门,打开这扇门便可以自由的飞翔。