2

我们编写了一个自定义 msbuild 任务,它对我们项目中的代码文件进行一些预处理。我们希望能够在标准错误列表窗口中显示错误和警告。

Visual Studio 提供了应该执行此操作的 TaskLoggingHelper (Log.LogError) 方法......但我发现 Log.LogError(message, messageArgs) 没有填写正确的文件名和行号...... Log.LogError(subCategory, errorCode, helpKeyword, file, lineNumber, columnNumber, endLineNumber, endColumnNumber, message, messageArgs) 返回一个错误,指出即使我明确设置了 message 也不能为空。

似乎 Visual Studio 可能没有使用重载(更详细)的方法。

我发送的代码行如下..

string fileName = "main.c";
int lineNum = 415;
int colNum = 5;
string message = "Error Message Text.";

Log.LogError("", "", "", fileName, lineNum, colNum, 0, 0, message, null); 

有没有人成功使用此方法重载在 MSBuild 中记录错误?

谢谢

** 更新 **

阅读尼克的回应(下)后,我做了以下测试......

Log.LogError("test1", "test2", "test2", fileName, lineNum, colNum, 0, 0, message);

我删除了 messageArgs 并在前三个参数中添加了一些文本。我得到的反应令人惊讶...... ErrorList 窗口中列出的消息是“test1”而不是“错误消息文本”。不过,不确定这是否能说明情况。

戴夫

4

2 回答 2

3

好吧,在解决这个问题很长时间之后.. 我永远无法得到 Log.LogError("", "", "", fileName, lineNum, colNum, 0, 0, message, null); 工作的解决方案。无论出于何种原因,这种重载似乎没有正确实现。我最终找到了做同样事情的替代解决方案。我认为最好提供我的解决方案,以防其他人也想做同样的事情;

BuildErrorEventArgs errorEvent = new BuildErrorEventArgs("", "", fileName, lineNum, colNum, 0, 0, messageErr, "", "");
BuildEngine.LogErrorEvent(errorEvent);

所以我所做的就是将 IBuildEngine 接口作为我的 ITask 类的一部分来实现。从那里我可以访问 LogErrorEvent,它允许您传递 BuildErrorEventArgs 结构,该结构使您可以访问错误的所有详细信息。

希望这可以帮助

于 2013-02-06T17:01:04.690 回答
-1

如果您从 Microsoft.Build.Utilities.Task 继承,您应该可以肯定地使用它。我一直在使用更简单的重载语法:

  base.Log.LogError(Strings.ItemsToFilterMissingError);

我注意到在您指定消息格式字符串的参数的大型重载中是类型

 params object[] messageArgs

我认为您可以省略参数而不是传递显式空值。那可能是你的问题。

于 2013-01-15T06:09:51.130 回答