使用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、自定义控件是封闭空间中的一扇门,打开这扇门便可以自由的飞翔。

 

posted @ 2019-12-16 11:23  Porbonan  阅读(4113)  评论(1编辑  收藏  举报