为什么不能在自定义任务构造函数中使用MsBuild TaskLoggingHelper?
在MSBuild中运行以下代码时,我得到一个InvalidOperationException。我想知道为什么会这样为什么不能在自定义任务构造函数中使用MsBuild TaskLoggingHelper?,logging,msbuild,Logging,Msbuild,在MSBuild中运行以下代码时,我得到一个InvalidOperationException。我想知道为什么会这样 public class SimpleTask3 : Task { public SimpleTask3() { Log.LogMessage(MessageImportance.High, "A MESSAGE"); } public override bool Execute() { return t
public class SimpleTask3 : Task
{
public SimpleTask3()
{
Log.LogMessage(MessageImportance.High, "A MESSAGE");
}
public override bool Execute()
{
return true;
}
}
收到的完整错误如下所示
error MSB4061: The "SimpleTask3" task could not be instantiated from ...ConsoleApplication1.dll
error MSB4061: System.InvalidOperationException: Task attempted to log before it was initialized. Message was: A MESSAGE
error MSB4061: at Microsoft.Build.Shared.ErrorUtilities.ThrowInvalidOperation(String resourceName, Object[] args)
error MSB4061: at Microsoft.Build.Utilities.TaskLoggingHelper.LogMessage(MessageImportance importance, String message, Object[] messageArgs)
error MSB4061: at SimpleTask3.SimpleTask3..ctor() in SimpleTask.cs:line 10
error MSB4060: The "SimpleTask3" task hasbeen declared or used incorrectly, or failed during construction. Check the spelling of the task name and the assembly name.
TaskLoggingHelper实例通过BuildEngine.LogMessageEvent进行日志记录,因此它们需要该BuildEngine实例才能使用。从: BuildEngine属性转发到_taskInstance.BuildEngine,_taskInstance是创建TaskLoggingHelper的任务。任务(您直接从中派生)在其构造函数中执行此操作:
protected Task()
{
_log = new TaskLoggingHelper(this);
}
因此,此时_taskInstance.BuildEngine仍然为空;必须把它放在哪里。“如何”和“为什么”基本上超出了这个答案的范围,因为它对您没有帮助:您无法登录构造函数,也无法对其进行任何更改。TaskLoggingHelper实例通过BuildEngine.LogMessageEvent进行日志记录,因此它们需要该BuildEngine实例才能使用。从: BuildEngine属性转发到_taskInstance.BuildEngine,_taskInstance是创建TaskLoggingHelper的任务。任务(您直接从中派生)在其构造函数中执行此操作:
protected Task()
{
_log = new TaskLoggingHelper(this);
}
因此,此时_taskInstance.BuildEngine仍然为空;必须把它放在哪里。“如何”和“为什么”基本上超出了这个答案的范围,因为它对您没有帮助:您无法登录构造函数,并且没有任何可以更改的内容。谢谢您的解释。你能解释一下原因吗?我明白这对我没有帮助,但我更多的是出于兴趣。再次感谢。我现在真的不知道为什么会这样做,因为代码中没有解释,但一个可能的原因是构造函数保持简单,这样您就可以编写无参数构造函数,而不必麻烦将参数传递给基类构造函数,代码的其余部分负责设置构建引擎,而您不必关心它。这是在这里完成的:谢谢你的解释。你能解释一下原因吗?我明白这对我没有帮助,但我更多的是出于兴趣。再次感谢。我现在真的不知道为什么会这样做,因为代码中没有解释,但一个可能的原因是构造函数保持简单,这样您就可以编写无参数构造函数,而不必麻烦将参数传递给基类构造函数,代码的其余部分负责设置构建引擎,而您不必关心它。这是在这里完成的: