为什么不能在自定义任务构造函数中使用MsBuild TaskLoggingHelper?

为什么不能在自定义任务构造函数中使用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

在MSBuild中运行以下代码时,我得到一个InvalidOperationException。我想知道为什么会这样

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仍然为空;必须把它放在哪里。“如何”和“为什么”基本上超出了这个答案的范围,因为它对您没有帮助:您无法登录构造函数,并且没有任何可以更改的内容。

谢谢您的解释。你能解释一下原因吗?我明白这对我没有帮助,但我更多的是出于兴趣。再次感谢。我现在真的不知道为什么会这样做,因为代码中没有解释,但一个可能的原因是构造函数保持简单,这样您就可以编写无参数构造函数,而不必麻烦将参数传递给基类构造函数,代码的其余部分负责设置构建引擎,而您不必关心它。这是在这里完成的:谢谢你的解释。你能解释一下原因吗?我明白这对我没有帮助,但我更多的是出于兴趣。再次感谢。我现在真的不知道为什么会这样做,因为代码中没有解释,但一个可能的原因是构造函数保持简单,这样您就可以编写无参数构造函数,而不必麻烦将参数传递给基类构造函数,代码的其余部分负责设置构建引擎,而您不必关心它。这是在这里完成的: