Вывод перенаправления процесса VB.NET не работает - PullRequest
0 голосов
/ 01 марта 2012

Я пытаюсь перенаправить вывод из приложения командной строки в VB.NET, и по какой-то причине не удается перенаправить вывод. Вот мой код:

    Dim myProcess As Process = New Process
    myProcess.StartInfo.FileName = "g++"
    myProcess.StartInfo.Arguments = CMDLineCommand
    myProcess.StartInfo.UseShellExecute = False
    myProcess.StartInfo.RedirectStandardOutput = True
    myProcess.StartInfo.RedirectStandardError = True
    myProcess.StartInfo.CreateNoWindow = True
    myProcess.Start()
    Dim output As String = myProcess.StandardOutput.ReadToEnd
    myProcess.WaitForExit()
    CMDLineOutputTextBox.Text = output

Кто-нибудь знает, почему он не перенаправляется? Заранее спасибо!

-Neil

РЕДАКТИРОВАТЬ: Вот мой полный код, на случай, если что-то странное с моим синтаксисом:

        Dim myProcess As Process = New Process
        myProcess.StartInfo.FileName = "g++"
        myProcess.StartInfo.Arguments = CMDLineCommand
        myProcess.StartInfo.UseShellExecute = False
        myProcess.StartInfo.RedirectStandardOutput = True
        myProcess.StartInfo.RedirectStandardError = True
        myProcess.StartInfo.CreateNoWindow = True
        myProcess.EnableRaisingEvents = True
        AddHandler myProcess.OutputDataReceived, AddressOf GotData
        myProcess.Start()
        CMDLineOutputTextBox.Text = ""
        myProcess.BeginOutputReadLine()

Позже ...

Private Sub GotData(sendingProcess As Object, outLine As DataReceivedEventArgs)
        If Not String.IsNullOrEmpty(outLine.Data) Then
            SetText(outLine.Data)
        End If
End Sub

Delegate Sub SetTextCallback(value As String)
Private Sub SetText(ByVal value As String)
    If Me.CMDLineOutputTextBox.InvokeRequired Then
        Dim d As New SetTextCallback(AddressOf SetText)
        Me.Invoke(d, New Object() {value})
    Else
        Me.CMDLineOutputTextBox.Text += value + Environment.NewLine
    End If
End Sub

Что-нибудь странное?

Ответы [ 2 ]

0 голосов
/ 18 ноября 2014

Я заметил, что waitforExit, кажется, блокирует код во время проверки invoke.required.Когда я вынимаю waitforexit, это работает.

0 голосов
/ 01 марта 2012

Ваш метод будет работать, если к тому моменту, когда вы дойдете до строки, в которой вы читаете вывод до конца, все выходные данные есть.Поскольку вы используете g ++, я предполагаю, что это не всегда так.Вам, вероятно, будет лучше использовать событие OutputDataReceived и захватывать данные из него.

Dim myProcess As Process = New Process
myProcess.StartInfo.FileName = "ping"
myProcess.StartInfo.Arguments = "www.google.com"
myProcess.StartInfo.UseShellExecute = False
myProcess.StartInfo.RedirectStandardOutput = True
myProcess.StartInfo.RedirectStandardError = True
myProcess.StartInfo.CreateNoWindow = True
myProcess.EnableRaisingEvents = True 
AddHandler myProcess.OutputDataReceived, AddressOf GotData
myProcess.Start()
myProcess.BeginOutputReadLine()

Затем вы обрабатываете событие следующим образом:

Private Sub GotData(sendingProcess As Object, outLine As DataReceivedEventArgs)
    If Not String.IsNullOrEmpty(outLine.Data) Then
        SetText(outLine.Data)
    End If
End Sub 

Delegate Sub SetTextCallback(value As String)
Private Sub SetText(ByVal value As String)
    If Me.TextBox3.InvokeRequired Then
        Dim d As New SetTextCallback(AddressOf SetText)
        Me.Invoke(d, New Object() {value})
    Else
        Me.TextBox3.Text += value + Environment.NewLine
    End If
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...