使用C#為Uipath封裝控件


一、需要了解的一些情況

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控件列表

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM