使用Console类从msbuild自定义任务记录

时间:2011-02-28 12:12:31

标签: .net vb.net visual-studio-2010 msbuild

我正在尝试将现有的命令行工具转换为msbuild自定义任务。 此工具使用System.Console类记录消息和错误 我已经在工具的程序集中添加了一个继承自Microsoft.Build.Utilities.Task的类并调用了工具主函数,并且自定义工具工作正常 - 但是没有显示消息/错误(在Visual Studio输出窗口中)。

我想避免更改原始工具的代码(否则我可以将每个“Console.Error.WriteLine”更改为“Log.LogError”)。 我想在调用工具的main函数之前调用Console.SetOut和SetError来改变stdout和stderr控制台流。为此,我需要实现一个继承自TextWriter的类。

所以我的问题是:

  1. 为什么System.Console不写 自动发送到日志 构建系统?
  2. 继承TextWriter并设置Console流 - 很好 这个问题的解决方案?
  3. 也许有人已经这样做了 工作并写了一个TextWriter 发送的实现 输出/错误到msbuild日志?
  4. 如果没有,我在哪里可以找到一些 给出一个例子的参考代码 一个实现的类 的TextWriter?
  5. 感谢。

2 个答案:

答案 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