Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 8521113
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 11, 20262026-06-11T06:43:31+00:00 2026-06-11T06:43:31+00:00

Hello I have found a great class written in c# which I would like

  • 0

Hello I have found a great class written in c# which I would like to use in a VB.NET project.

I found it in this thread:
C# : Redirect console application output : How to flush the output?

The C# Class
looks like this:

using System;
using System.Collections;
using System.IO;
using System.Text;
using System.Threading;

namespace System.Diagnostics
{
    internal delegate void UserCallBack(string data);
    public delegate void DataReceivedEventHandler(object sender, DataReceivedEventArgs e);

    public class FixedProcess : Process
    {
        internal AsyncStreamReader output;
        internal AsyncStreamReader error;
        public event DataReceivedEventHandler OutputDataReceived;
        public event DataReceivedEventHandler ErrorDataReceived;

        public new void BeginOutputReadLine()
        {
            Stream baseStream = StandardOutput.BaseStream;
            this.output = new AsyncStreamReader(this, baseStream, new UserCallBack(this.FixedOutputReadNotifyUser), StandardOutput.CurrentEncoding);
            this.output.BeginReadLine();
        }

        public void BeginErrorReadLine()
        {
            Stream baseStream = StandardError.BaseStream;
            this.error = new AsyncStreamReader(this, baseStream, new UserCallBack(this.FixedErrorReadNotifyUser), StandardError.CurrentEncoding);
            this.error.BeginReadLine();
        }

        internal void FixedOutputReadNotifyUser(string data)
        {
            DataReceivedEventHandler outputDataReceived = this.OutputDataReceived;
            if (outputDataReceived != null)
            {
                DataReceivedEventArgs dataReceivedEventArgs = new DataReceivedEventArgs(data);
                if (this.SynchronizingObject != null && this.SynchronizingObject.InvokeRequired)
                {
                    this.SynchronizingObject.Invoke(outputDataReceived, new object[]
                    {
                        this, 
                        dataReceivedEventArgs
                    });
                    return;
                }
                outputDataReceived(this, dataReceivedEventArgs);
            }
        }

        internal void FixedErrorReadNotifyUser(string data)
        {
            DataReceivedEventHandler errorDataReceived = this.ErrorDataReceived;
            if (errorDataReceived != null)
            {
                DataReceivedEventArgs dataReceivedEventArgs = new DataReceivedEventArgs(data);
                if (this.SynchronizingObject != null && this.SynchronizingObject.InvokeRequired)
                {
                    this.SynchronizingObject.Invoke(errorDataReceived, new object[]
                    {
                        this, 
                        dataReceivedEventArgs
                    });
                    return;
                }
                errorDataReceived(this, dataReceivedEventArgs);
            }
        }
    }

    internal class AsyncStreamReader : IDisposable
    {
        internal const int DefaultBufferSize = 1024;
        private const int MinBufferSize = 128;
        private Stream stream;
        private Encoding encoding;
        private Decoder decoder;
        private byte[] byteBuffer;
        private char[] charBuffer;
        private int _maxCharsPerBuffer;
        private Process process;
        private UserCallBack userCallBack;
        private bool cancelOperation;
        private ManualResetEvent eofEvent;
        private Queue messageQueue;
        private StringBuilder sb;
        private bool bLastCarriageReturn;
        public virtual Encoding CurrentEncoding
        {
            get
            {
                return this.encoding;
            }
        }
        public virtual Stream BaseStream
        {
            get
            {
                return this.stream;
            }
        }
        internal AsyncStreamReader(Process process, Stream stream, UserCallBack callback, Encoding encoding)
            : this(process, stream, callback, encoding, 1024)
        {
        }
        internal AsyncStreamReader(Process process, Stream stream, UserCallBack callback, Encoding encoding, int bufferSize)
        {
            this.Init(process, stream, callback, encoding, bufferSize);
            this.messageQueue = new Queue();
        }
        private void Init(Process process, Stream stream, UserCallBack callback, Encoding encoding, int bufferSize)
        {
            this.process = process;
            this.stream = stream;
            this.encoding = encoding;
            this.userCallBack = callback;
            this.decoder = encoding.GetDecoder();
            if (bufferSize < 128)
            {
                bufferSize = 128;
            }
            this.byteBuffer = new byte[bufferSize];
            this._maxCharsPerBuffer = encoding.GetMaxCharCount(bufferSize);
            this.charBuffer = new char[this._maxCharsPerBuffer];
            this.cancelOperation = false;
            this.eofEvent = new ManualResetEvent(false);
            this.sb = null;
            this.bLastCarriageReturn = false;
        }
        public virtual void Close()
        {
            this.Dispose(true);
        }
        void IDisposable.Dispose()
        {
            this.Dispose(true);
            GC.SuppressFinalize(this);
        }
        protected virtual void Dispose(bool disposing)
        {
            if (disposing && this.stream != null)
            {
                this.stream.Close();
            }
            if (this.stream != null)
            {
                this.stream = null;
                this.encoding = null;
                this.decoder = null;
                this.byteBuffer = null;
                this.charBuffer = null;
            }
            if (this.eofEvent != null)
            {
                this.eofEvent.Close();
                this.eofEvent = null;
            }
        }
        internal void BeginReadLine()
        {
            if (this.cancelOperation)
            {
                this.cancelOperation = false;
            }
            if (this.sb == null)
            {
                this.sb = new StringBuilder(1024);
                this.stream.BeginRead(this.byteBuffer, 0, this.byteBuffer.Length, new AsyncCallback(this.ReadBuffer), null);
                return;
            }
            this.FlushMessageQueue();
        }
        internal void CancelOperation()
        {
            this.cancelOperation = true;
        }
        private void ReadBuffer(IAsyncResult ar)
        {
            int num;
            try
            {
                num = this.stream.EndRead(ar);
            }
            catch (IOException)
            {
                num = 0;
            }
            catch (OperationCanceledException)
            {
                num = 0;
            }
            if (num == 0)
            {
                lock (this.messageQueue)
                {
                    if (this.sb.Length != 0)
                    {
                        this.messageQueue.Enqueue(this.sb.ToString());
                        this.sb.Length = 0;
                    }
                    this.messageQueue.Enqueue(null);
                }
                try
                {
                    this.FlushMessageQueue();
                    return;
                }
                finally
                {
                    this.eofEvent.Set();
                }
            }
            int chars = this.decoder.GetChars(this.byteBuffer, 0, num, this.charBuffer, 0);
            this.sb.Append(this.charBuffer, 0, chars);
            this.GetLinesFromStringBuilder();
            this.stream.BeginRead(this.byteBuffer, 0, this.byteBuffer.Length, new AsyncCallback(this.ReadBuffer), null);
        }
        private void GetLinesFromStringBuilder()
        {
            int i = 0;
            int num = 0;
            int length = this.sb.Length;
            if (this.bLastCarriageReturn && length > 0 && this.sb[0] == '\n')
            {
                i = 1;
                num = 1;
                this.bLastCarriageReturn = false;
            }
            while (i < length)
        {
            char c = this.sb[i];
            if (c == '\r' || c == '\n')
            {
                if (c == '\r' && i + 1 < length && this.sb[i + 1] == '\n')
                {
                    i++;
                }

                string obj = this.sb.ToString(num, i + 1 - num);

                num = i + 1;

                lock (this.messageQueue)
                {
                    this.messageQueue.Enqueue(obj);
                }
            }
            i++;
        }

            // Flush Fix: Send Whatever is left in the buffer
            string endOfBuffer = this.sb.ToString(num, length - num);
            lock (this.messageQueue)
            {
                this.messageQueue.Enqueue(endOfBuffer);
                num = length;
            }
            // End Flush Fix

            if (this.sb[length - 1] == '\r')
            {
                this.bLastCarriageReturn = true;
            }
            if (num < length)
            {
                this.sb.Remove(0, num);
            }
            else
            {
                this.sb.Length = 0;
            }
            this.FlushMessageQueue();
        }
        private void FlushMessageQueue()
        {
            while (this.messageQueue.Count > 0)
            {
                lock (this.messageQueue)
                {
                    if (this.messageQueue.Count > 0)
                    {
                        string data = (string)this.messageQueue.Dequeue();
                        if (!this.cancelOperation)
                        {
                            this.userCallBack(data);
                        }
                    }
                    continue;
                }
                break;
            }
        }
        internal void WaitUtilEOF()
        {
            if (this.eofEvent != null)
            {
                this.eofEvent.WaitOne();
                this.eofEvent.Close();
                this.eofEvent = null;
            }
        }
    }

    public class DataReceivedEventArgs : EventArgs
    {
        internal string _data;
        /// <summary>Gets the line of characters that was written to a redirected <see cref="T:System.Diagnostics.Process" /> output stream.</summary>
        /// <returns>The line that was written by an associated <see cref="T:System.Diagnostics.Process" /> to its redirected <see cref="P:System.Diagnostics.Process.StandardOutput" /> or <see cref="P:System.Diagnostics.Process.StandardError" /> stream.</returns>
        /// <filterpriority>2</filterpriority>
        public string Data
        {
            get
            {
                return this._data;
            }
        }
        internal DataReceivedEventArgs(string data)
        {
            this._data = data;
        }
    }
}

My Converted Code looks like this:

Imports System
Imports System.Collections
Imports System.IO
Imports System.Text
Imports System.Threading

Namespace System.Diagnostics
    Friend Delegate Sub UserCallBack(data As String)
    Public Delegate Sub DataReceivedEventHandler(sender As Object, e As DataReceivedEventArgs)

    Public Class FixedProcess
        Inherits Process
        Friend output As AsyncStreamReader
        Friend [error] As AsyncStreamReader
        Public Event OutputDataReceived As DataReceivedEventHandler '<----------Error 1
        Public Event ErrorDataReceived As DataReceivedEventHandler '<------------Error 2

        Public Shadows Sub BeginOutputReadLine()
            Dim baseStream As Stream = StandardOutput.BaseStream
            Me.output = New AsyncStreamReader(Me, baseStream, New UserCallBack(AddressOf Me.FixedOutputReadNotifyUser), StandardOutput.CurrentEncoding)
            Me.output.BeginReadLine()
        End Sub

        Public Sub BeginErrorReadLine()   '<-------------Error 3
            Dim baseStream As Stream = StandardError.BaseStream
            Me.[error] = New AsyncStreamReader(Me, baseStream, New UserCallBack(AddressOf Me.FixedErrorReadNotifyUser), StandardError.CurrentEncoding)
            Me.[error].BeginReadLine()
        End Sub

        Friend Sub FixedOutputReadNotifyUser(data As String)

            Dim outputDataReceived As DataReceivedEventHandler = Me.OutputDataReceived '<------------Error 4
            If outputDataReceived IsNot Nothing Then
                Dim dataReceivedEventArgs As New DataReceivedEventArgs(data)
                If Me.SynchronizingObject IsNot Nothing AndAlso Me.SynchronizingObject.InvokeRequired Then
                    Me.SynchronizingObject.Invoke(outputDataReceived, New Object() {Me, dataReceivedEventArgs})
                    Return
                End If
                outputDataReceived(Me, dataReceivedEventArgs)
            End If
        End Sub

        Friend Sub FixedErrorReadNotifyUser(data As String)
            Dim errorDataReceived As DataReceivedEventHandler = Me.ErrorDataReceived '<-------------Error 5
            If errorDataReceived IsNot Nothing Then
                Dim dataReceivedEventArgs As New DataReceivedEventArgs(data)
                If Me.SynchronizingObject IsNot Nothing AndAlso Me.SynchronizingObject.InvokeRequired Then
                    Me.SynchronizingObject.Invoke(errorDataReceived, New Object() {Me, dataReceivedEventArgs})
                    Return
                End If
                errorDataReceived(Me, dataReceivedEventArgs)
            End If
        End Sub
    End Class

    Friend Class AsyncStreamReader
        Implements IDisposable
        Friend Const DefaultBufferSize As Integer = 1024
        Private Const MinBufferSize As Integer = 128
        Private stream As Stream
        Private encoding As Encoding
        Private decoder As Decoder
        Private byteBuffer As Byte()
        Private charBuffer As Char()
        Private _maxCharsPerBuffer As Integer
        Private process As Process
        Private userCallBack As UserCallBack
        Private cancelOperation As Boolean
        Private eofEvent As ManualResetEvent
        Private messageQueue As Queue
        Private sb As StringBuilder
        Private bLastCarriageReturn As Boolean
        Public Overridable ReadOnly Property CurrentEncoding() As Encoding
            Get
                Return Me.encoding
            End Get
        End Property
        Public Overridable ReadOnly Property BaseStream() As Stream
            Get
                Return Me.stream
            End Get
        End Property
        Friend Sub New(process As Process, stream As Stream, callback As UserCallBack, encoding As Encoding)
            Me.New(process, stream, callback, encoding, 1024)
        End Sub
        Friend Sub New(process As Process, stream As Stream, callback As UserCallBack, encoding As Encoding, bufferSize As Integer)
            Me.Init(process, stream, callback, encoding, bufferSize)
            Me.messageQueue = New Queue()
        End Sub
        Private Sub Init(process As Process, stream As Stream, callback As UserCallBack, encoding As Encoding, bufferSize As Integer)
            Me.process = process
            Me.stream = stream
            Me.encoding = encoding
            Me.userCallBack = callback
            Me.decoder = encoding.GetDecoder()
            If bufferSize < 128 Then
                bufferSize = 128
            End If
            Me.byteBuffer = New Byte(bufferSize - 1) {}
            Me._maxCharsPerBuffer = encoding.GetMaxCharCount(bufferSize)
            Me.charBuffer = New Char(Me._maxCharsPerBuffer - 1) {}
            Me.cancelOperation = False
            Me.eofEvent = New ManualResetEvent(False)
            Me.sb = Nothing
            Me.bLastCarriageReturn = False
        End Sub
        Public Overridable Sub Close()
            Me.Dispose(True)
        End Sub
        Private Sub IDisposable_Dispose() Implements IDisposable.Dispose
            Me.Dispose(True)
            GC.SuppressFinalize(Me)
        End Sub
        Protected Overridable Sub Dispose(disposing As Boolean)
            If disposing AndAlso Me.stream IsNot Nothing Then
                Me.stream.Close()
            End If
            If Me.stream IsNot Nothing Then
                Me.stream = Nothing
                Me.encoding = Nothing
                Me.decoder = Nothing
                Me.byteBuffer = Nothing
                Me.charBuffer = Nothing
            End If
            If Me.eofEvent IsNot Nothing Then
                Me.eofEvent.Close()
                Me.eofEvent = Nothing
            End If
        End Sub
        Friend Sub BeginReadLine()
            If Me.cancelOperation Then
                Me.cancelOperation = False
            End If
            If Me.sb Is Nothing Then
                Me.sb = New StringBuilder(1024)
                Me.stream.BeginRead(Me.byteBuffer, 0, Me.byteBuffer.Length, New AsyncCallback(AddressOf Me.ReadBuffer), Nothing)
                Return
            End If
            Me.FlushMessageQueue()
        End Sub
        Friend Sub CancelOperation()  '<------- Error 6
            Me.cancelOperation = True
        End Sub
        Private Sub ReadBuffer(ar As IAsyncResult)
            Dim num As Integer
            Try
                num = Me.stream.EndRead(ar)
            Catch generatedExceptionName As IOException
                num = 0
            Catch generatedExceptionName As OperationCanceledException
                num = 0
            End Try
            If num = 0 Then
                SyncLock Me.messageQueue
                    If Me.sb.Length <> 0 Then
                        Me.messageQueue.Enqueue(Me.sb.ToString())
                        Me.sb.Length = 0
                    End If
                    Me.messageQueue.Enqueue(Nothing)
                End SyncLock
                Try
                    Me.FlushMessageQueue()
                    Return
                Finally
                    Me.eofEvent.[Set]()
                End Try
            End If
            Dim chars As Integer = Me.decoder.GetChars(Me.byteBuffer, 0, num, Me.charBuffer, 0)
            Me.sb.Append(Me.charBuffer, 0, chars)
            Me.GetLinesFromStringBuilder()
            Me.stream.BeginRead(Me.byteBuffer, 0, Me.byteBuffer.Length, New AsyncCallback(AddressOf Me.ReadBuffer), Nothing)
        End Sub
        Private Sub GetLinesFromStringBuilder()
            Dim i As Integer = 0
            Dim num As Integer = 0
            Dim length As Integer = Me.sb.Length
            If Me.bLastCarriageReturn AndAlso length > 0 AndAlso Me.sb(0) = ControlChars.Lf Then
                i = 1
                num = 1
                Me.bLastCarriageReturn = False
            End If
            While i < length
                Dim c As Char = Me.sb(i)
                If c = ControlChars.Cr OrElse c = ControlChars.Lf Then
                    If c = ControlChars.Cr AndAlso i + 1 < length AndAlso Me.sb(i + 1) = ControlChars.Lf Then
                        i += 1
                    End If

                    Dim obj As String = Me.sb.ToString(num, i + 1 - num)

                    num = i + 1

                    SyncLock Me.messageQueue
                        Me.messageQueue.Enqueue(obj)
                    End SyncLock
                End If
                i += 1
            End While

            ' Flush Fix: Send Whatever is left in the buffer
            Dim endOfBuffer As String = Me.sb.ToString(num, length - num)
            SyncLock Me.messageQueue
                Me.messageQueue.Enqueue(endOfBuffer)
                num = length
            End SyncLock
            ' End Flush Fix

            If Me.sb(length - 1) = ControlChars.Cr Then
                Me.bLastCarriageReturn = True
            End If
            If num < length Then
                Me.sb.Remove(0, num)
            Else
                Me.sb.Length = 0
            End If
            Me.FlushMessageQueue()
        End Sub
        Private Sub FlushMessageQueue()
            While Me.messageQueue.Count > 0
                SyncLock Me.messageQueue
                    If Me.messageQueue.Count > 0 Then
                        Dim data As String = DirectCast(Me.messageQueue.Dequeue(), String)
                        If Not Me.cancelOperation Then
                            Me.userCallBack(data)
                        End If
                    End If
                    Continue While
                End SyncLock
                Exit While
            End While
        End Sub
        Friend Sub WaitUtilEOF()
            If Me.eofEvent IsNot Nothing Then
                Me.eofEvent.WaitOne()
                Me.eofEvent.Close()
                Me.eofEvent = Nothing
            End If
        End Sub
    End Class

    Public Class DataReceivedEventArgs
        Inherits EventArgs
        Friend _data As String
        ''' <summary>Gets the line of characters that was written to a redirected <see cref="T:System.Diagnostics.Process" /> output stream.</summary>
        ''' <returns>The line that was written by an associated <see cref="T:System.Diagnostics.Process" /> to its redirected <see cref="P:System.Diagnostics.Process.StandardOutput" /> or <see cref="P:System.Diagnostics.Process.StandardError" /> stream.</returns>
        ''' <filterpriority>2</filterpriority>
        Public ReadOnly Property Data() As String
            Get
                Return Me._data
            End Get
        End Property
        Friend Sub New(data As String)
            Me._data = data
        End Sub
    End Class
End Namespace

Error 1-3 seem to be warnings and might actually work
Especially Error 4 and 5 give me a headache “Public Event OutputDataRecieved(sender As Object, e As DataRecievedEventArgs) is an event, and cannot be called directly. Use the RaiseEvent statement to raise an event.”

Eventhandlers dont seem to work with any of the code converters I have tried and I am lacking the VB skills to convert it manually.

Is there a friendly soul out there who can properly convert this class so that it actually works?

Thanks a lot!

Roman

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-11T06:43:33+00:00Added an answer on June 11, 2026 at 6:43 am

    You need to add the Overloads keyword to the BeginErrorReadLine method signature.

     Public Overloads Sub BeginErrorReadLine()   '<-------------Error 3
    

    The event declarations need to be declared as Shadows because they otherwise conflict with the base class event declarations.

     Public Shadows Event OutputDataReceived As DataReceivedEventHandler '<----------Error 1
    

    Then in your FixedOutputReadNotifyUser method, you don’t need to check the event handler as you do in C# to see if it is nothing. VB will do that for you. Instead, simply raise it as follows:

    Friend Sub FixedOutputReadNotifyUser(data As String)
        Dim dataReceivedEventArgs As New DataReceivedEventArgs(data)
        RaiseEvent OutputDataReceived(Me, dataReceivedEventArgs)
    End Sub
    

    The last issue is the original class uses case sensitivity to differentiate between the “cancelOperation” field and “CancelOperation” method. Best option is to prefix the field with an underscore as follows: Private _CancelOperation As Boolean and then fix the corresponding references in the class.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

Hello I have like this 2 tables class User public int UserId{get;set;} { ....
Hello this is may first question and I have found so far the following
Hello I have a datatable that I would like to filter with a single
hello i have found this code on windows documentation but i don't get what
This I have found on the net in various places but with no actual
Hello I have a small function which I use for searching for a users
Hello people of StackOverflow! I have used the searrch option, I've found some related
hello i have this question i was trying to find a way to call
I want to create an Application with tabs, and I have found this guide
Hello (this is a long post sorry), I am writing a application in ASP.NET

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.