从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
version18.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)怎么样?好的,整个想法是在新的文件日志记录的同时执行通常的日志记录活动。没有信息,它就没有意义。