我正在尝试将现有的命令行工具转换为msbuild自定义任务。 此工具使用System.Console类记录消息和错误 我已经在工具的程序集中添加了一个继承自Microsoft.Build.Utilities.Task的类并调用了工具主函数,并且自定义工具工作正常 - 但是没有显示消息/错误(在Visual Studio输出窗口中)。
我想避免更改原始工具的代码(否则我可以将每个“Console.Error.WriteLine”更改为“Log.LogError”)。 我想在调用工具的main函数之前调用Console.SetOut和SetError来改变stdout和stderr控制台流。为此,我需要实现一个继承自TextWriter的类。
所以我的问题是:
感谢。
答案 0 :(得分:2)
Public Class TaskLogger
Inherits TextWriter
Public Enum TaskLoggerType
out
err
End Enum
Private m_logger As TaskLoggingHelper
Private m_logger_type As TaskLoggerType
Sub New(ByRef logger As TaskLoggingHelper, ByVal type As TaskLoggerType)
m_logger = logger
m_logger_type = type
End Sub
Public Overrides ReadOnly Property Encoding As System.Text.Encoding
Get
Return System.Text.Encoding.Default
End Get
End Property
Public Overrides Sub WriteLine(ByVal value As String)
Select Case m_logger_type
Case TaskLoggerType.out
m_logger.LogMessage(value)
Case TaskLoggerType.err
m_logger.LogError(value)
End Select
End Sub
End Class
...
Public Overrides Function Execute() As Boolean
Dim oldOut As TextWriter = Console.Out
Dim oldErr As TextWriter = Console.Error
Dim newOut As TextWriter = New TaskLogger(Log, TaskLogger.TaskLoggerType.out)
Dim newErr As TextWriter = New TaskLogger(Log, TaskLogger.TaskLoggerType.err)
Console.SetOut(newOut)
Console.SetError(newErr)
Dim result As Boolean = Run(...)
Console.SetOut(oldOut)
Console.SetOut(oldErr)
Return result
End Function
答案 1 :(得分:0)
一个选项可能是有一个包装器任务,继承自ToolTask,它只调用这个外部工具,stdout / stderr消息将被正确记录。您甚至可以覆盖LogEventsFromTextOutput并正确匹配并记录错误和警告,这些错误和警告将显示在VS中。例如。 LC.cs