一、需要了解的一些情況
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、自定義控件是封閉空間中的一扇門,打開這扇門便可以自由的飛翔。