Receiving Debug and Trace Messages by Adding a Listener

Debug and trace messages can be received in a form (or any other place) by adding a custom listener. The sample below contains the class ExtendedTraceListener which can be used to capture these messages:

Imports System.Diagnostics

''' <summary>
'''   Raises events for trace messages.
''' </summary>
Public Class ExtendedTraceListener
    Inherits TraceListener

    ''' <summary>
    '''   Occurs when a trace message is received.
    ''' </summary>
    ''' <param name="sender">The source of the event.</param>
    ''' <param name="e">
    '''   A <c>ReceiveEventArgs</c> that contains the event data.
    ''' </param>
    Public Event Receive(ByVal sender As Object, ByVal e As ReceiveEventArgs)

    ''' <summary>
    '''   Raises the <c>Receive</c> event.
    ''' </summary>
    ''' <param name="e">
    '''   A <c>ReceiveEventArgs</c> that contains the event data.
    ''' </param>
    Protected Sub OnReceive(ByVal e As ReceiveEventArgs)
        RaiseEvent Receive(Me, e)
    End Sub

    Public Overloads Overrides Sub Write(ByVal message As String)
        OnReceive(New ReceiveEventArgs(message))
    End Sub

    Public Overloads Overrides Sub WriteLine(ByVal message As String)
        OnReceive(New ReceiveEventArgs(message & ControlChars.NewLine))
    End Sub
End Class

''' <summary>
'''   Provides data for the <c>Receive</c> event.
''' </summary>
Public Class ReceiveEventArgs
    Inherits EventArgs

    Private m_Text As String

    ''' <summary>
    '''   Creates a new instance of <c>ReceiveEventArgs</c>.
    ''' </summary>
    ''' <param name="Text">
    '''   The initial value of the <c>Text</c> property.
    ''' </param>
    Public Sub New(ByVal Text As String)
        Me.Text = Text
    End Sub

    ''' <summary>
    '''   Gets or sets the text of the received message.
    ''' </summary>
    ''' <value>The text of the received message.</value>
    Public Property Text() As String
        Get
            Return m_Text
        End Get
        Set(ByVal Value As String)
            m_Text = Value
        End Set
    End Property
End Class

Usage:

Private WithEvents DebugListener As New ExtendedTraceListener()

⋮


' In the constructor.
Debug.Listeners.Add(DebugListener)

⋮


' Later in the code.
Debug.Write("dot")
Debug.Write("net")
Debug.WriteLineIf(True, "Ha ha...")
Debug.WriteLine("")
Debug.WriteLine("Hello World!")
Debug.WriteLine("Visual Basic .NET rocks!")

⋮

Private Sub DebugListener_Receive( _
    ByVal sender As Object, _
    ByVal e As ReceiveEventArgs _
) Handles DebugListener.Receive
    Me.TextBox1.AppendText(e.Text)
End Sub