从C#执行UiPath活动会导致空指针异常

从C#执行UiPath活动会导致空指针异常,c#,uipath,C#,Uipath,对于UiPathversion18.2.3I成功创建了一个新的日志记录活动。其思想是,在将所有内容都记录到Orchestrator中时,新活动还将记录到一个文件中。接下来,我们的组织将升级到UiPath 2019.4.3,我的活动不起作用,因此我需要将UiPath引用升级到当前的DLL。这样做会得到一个可编译的代码,但该活动会导致空指针异常。为什么? 这是我的代码: using System; using System.Activities; using System.Activities.Pr

对于
UiPath
version
18.2.3
I成功创建了一个新的日志记录活动。其思想是,在将所有内容都记录到
Orchestrator
中时,新活动还将记录到一个文件中。接下来,我们的组织将升级到
UiPath 2019.4.3
,我的活动不起作用,因此我需要将UiPath引用升级到当前的
DLL
。这样做会得到一个可编译的代码,但该活动会导致
空指针异常
。为什么?

这是我的代码:

using System;
using System.Activities;
using System.Activities.Presentation.Metadata;
using System.ComponentModel;
using System.IO;
using System.Text;
using UiPath.Core.Activities;

namespace CustomCode.Log
{
    /// <summary>
    /// Designer attribute gives a look & feel like UiPaths own LogMessage activity
    /// </summary>
    [Designer(typeof(UiPath.Core.Activities.Design.LogDesigner))]
    public class LogMessage : CodeActivity, IRegisterMetadata
    {
        [Category("Input")]
        public CurentLogLevel Level { get; set; }

        [Category("Input")]
        public InArgument<System.String> Message { get; set; }

        [Category("Input")]
        public InArgument<System.String> LogFilePath { get; set; }

        /// <summary>
        /// UiPath Log Message object reference
        /// </summary>
        private UiPath.Core.Activities.LogMessage _LogMessage { get; set; }

        /// <summary>
        /// Constructor
        /// </summary>
        public LogMessage()
        {
            DisplayName = "Extended Log Message";            
            Level = CurentLogLevel.Trace; // default setting
        }

        /// <summary>
        /// declare dummy register metadata class to force UiPath to load this assembly
        /// </summary>
        public void Register()
        {
            // intentionally empty
        }

        /// <summary>
        /// First log as if done by native UiPath then log to the file specified
        /// </summary>
        /// <param name="context"></param>
        protected override void Execute(CodeActivityContext context)
        {
            // first do the usual UiPath logging...
            string message = Message.Get(context);
            //bool isNew = false;

            #region log as UiPath standard
            // it is necessary to create new objects every time. 
            // reassigning property values causes errors when logging is frequent...
            _LogMessage = new  UiPath.Core.Activities.LogMessage
            {
                Level = this.Level,
                Message = new InArgument<string>(message),
            };

            // do UiPath log 
            try
            {
                WorkflowInvoker.Invoke(_LogMessage); // NULL POINTER EXCEPTION HERE
            }
            catch (Exception ex)
            {
                throw new Exception("Internal UiPath Invoke Exception ", ex);
            }
            #endregion

            string logFilePath = LogFilePath.Get(context);

            // log to file if path is specified...
            if (logFilePath != null)
            {
                LogToFile(logFilePath, message, Level.ToString());
            }
        }

        /// <summary>
        /// Method to write a line in the log file
        /// </summary>
        /// <param name="filename">the file to which to log</param>
        /// <param name="message">the log message</param>
        /// <param name="level">the log level</param>
        private void LogToFile(string filename, string message, string level)
        {
            StringBuilder LogLine = new StringBuilder(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            LogLine.Append("\t");
            LogLine.Append(level);
            LogLine.Append("\t");

            LogLine.Append("\t - ");
            LogLine.Append(message);
            LogLine.Append(Environment.NewLine);

            try
            {
                // append the log line
                File.AppendAllText(filename, LogLine.ToString());
            }
            catch (Exception ex)
            {
                // try to log the exception in UiPath
                _LogMessage.Message = new InArgument<string>(ex.Message + Environment.NewLine + ex.StackTrace);
                throw new Exception("Internal append to log file exception", ex);
            }
        }
    }
}
使用系统;
使用系统活动;
使用System.Activities.Presentation.Metadata;
使用系统组件模型;
使用System.IO;
使用系统文本;
使用UiPath.Core.Activities;
命名空间CustomCode.Log
{
/// 
///Designer属性提供了类似于UiPaths自己的LogMessage活动的外观
/// 
[设计器(typeof(UiPath.Core.Activities.Design.LogDesigner))]
公共类日志消息:CodeActivity,IRegisterMetadata
{
[类别(“输入”)]
公共currentloglevel级别{get;set;}
[类别(“输入”)]
公共InArgument消息{get;set;}
[类别(“输入”)]
公共InArgument日志文件路径{get;set;}
/// 
///UiPath日志消息对象引用
/// 
私有UiPath.Core.Activities.LogMessage _LogMessage{get;set;}
/// 
///建造师
/// 
公共日志消息()
{
DisplayName=“扩展日志消息”;
Level=CurentLogLevel.Trace;//默认设置
}
/// 
///声明虚拟寄存器元数据类以强制UiPath加载此程序集
/// 
公开作废登记册()
{
//故意清空
}
/// 
///首先将日志记录为本机UiPath完成的日志,然后将日志记录到指定的文件
/// 
/// 
受保护的覆盖无效执行(CodeActivityContext上下文)
{
//首先做通常的UiPath日志记录。。。
string message=message.Get(上下文);
//bool isNew=false;
#作为UiPath标准的区域日志
//每次都需要创建新对象。
//当日志记录频繁时,重新指定属性值会导致错误。。。
_LogMessage=new UiPath.Core.Activities.LogMessage
{
Level=this.Level,
消息=新的不一致性(消息),
};
//执行UiPath日志
尝试
{
WorkflowInvoker.Invoke(_LogMessage);//此处出现空指针异常
}
捕获(例外情况除外)
{
抛出新异常(“内部UiPath调用异常”,ex);
}
#端区
字符串logFilePath=logFilePath.Get(上下文);
//如果指定了路径,则记录到文件。。。
if(logFilePath!=null)
{
LogToFile(logFilePath,message,Level.ToString());
}
}
/// 
///方法在日志文件中写入一行
/// 
///要记录到的文件
///日志消息
///日志级别
私有无效日志文件(字符串文件名、字符串消息、字符串级别)
{
StringBuilder LogLine=新的StringBuilder(DateTime.Now.ToString(“yyyy-MM-dd-HH:MM:ss”);
LogLine.Append(“\t”);
LogLine.Append(级别);
LogLine.Append(“\t”);
LogLine.Append(“\t-”);
LogLine.Append(消息);
LogLine.Append(Environment.NewLine);
尝试
{
//追加日志行
File.AppendAllText(文件名,LogLine.ToString());
}
捕获(例外情况除外)
{
//尝试在UiPath中记录异常
_LogMessage.Message=newinagrament(例如Message+Environment.NewLine+ex.StackTrace);
抛出新异常(“内部附加到日志文件异常”,ex);
}
}
}
}

您的错误表明\u LogMessage为空,因此为空指针错误

您只需在代码部分之后进行检查即可验证这一点

_LogMessage = new  UiPath.Core.Activities.LogMessage
            {
                Level = this.Level,
                Message = new InArgument<string>(message),
            };

希望这会有所帮助。

您的错误表明\u LogMessage为空,因此为空指针错误

您只需在代码部分之后进行检查即可验证这一点

_LogMessage = new  UiPath.Core.Activities.LogMessage
            {
                Level = this.Level,
                Message = new InArgument<string>(message),
            };

希望这会有帮助。

我可以确认变量_LogMessage不是空的。您能尝试删除line Level=this.Level并尝试您的代码吗?我做到了。同样的空异常仍然发生。Message=newinagrament(Message)怎么样?好的,整个想法是在新的文件日志记录的同时执行通常的日志记录活动。如果没有消息,它就没有任何用途。我可以确认变量_LogMessage不是空的。你能尝试删除line-Level=this.Level并尝试你的代码吗?我做到了。同样的空异常仍然发生。Message=newinagrament(Message)怎么样?好的,整个想法是在新的文件日志记录的同时执行通常的日志记录活动。没有信息,它就没有意义。