2012-03-01 24 views
0

VB.NETのコマンドラインアプリケーションから出力をリダイレクトしようとしていますが、何らかの理由で出力をリダイレクトできません。ここに私のコード: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 

なぜそれがリダイレクトされていないのですか?前もって感謝します!

EDIT -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 

何か:ここに私の完全なコードがありますが、場合には、私の構文で変なものがありますか?

答えて

0

最後まで出力を読んだときに出力がすべて出力されるまで、メソッドは正常に機能します。 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 
+0

私のフルコードを追加しました...何らかの理由で、CMDLineOutputTextBoxテキストボックスにコマンドライン出力が表示されません。P – neilf

+0

SetTextメソッドにブレークポイントを設定し、そこに確実に到達していることを確認してください。あなたのテキストボックスは複数行に設定されていますか? –

+0

はい、テキストボックスは複数行です。 – neilf

0

を私はwaitforExitがinvoke.requiredチェック中にコードロックを作るように見える気づきました。私がwaitforexitを取り出すとき、それは働く。

+1

waitForExitが実際に待つことを意味しますか? :) – eckes

関連する問題