当在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.
答案 0 :(得分:0)
TaskLoggingHelper实例通过BuildEngine.LogMessageEvent进行日志记录,因此它们需要BuildEngine实例才能使用它们。来自source code:
// If BuildEngine is null, task attempted to log before it was set on it,
// presumably in its constructor. This is not allowed, and all
// we can do is throw.
if (BuildEngine == null)
{
ErrorUtilities.ThrowInvalidOperation("LoggingBeforeTaskInitialization", e.Message);
}
BuildEngine属性转发到_taskInstance.BuildEngine,_taskInstance是创建TaskLoggingHelper的Task。一个Task(你直接从中派生)在它的构造函数中执行此操作:
protected Task()
{
_log = new TaskLoggingHelper(this);
}
所以那时_taskInstance.BuildEngine仍为null;它必须设置在elewhere。如何以及为什么基本上超出了这个答案的范围,因为它对你没有帮助:你无法登录构造函数,也没有任何关于它的改变......