2010-01-09 21 views
1

當在單獨的* .dll文件中創建進程時,我很難將控制檯應用程序的輸出重定向到Windows窗體應用程序(請原諒這個sl termin的術語,但我是新的到編程)。我遇到了這個鏈接(我可能會追求他的方法),詳述一個類似的問題:http://www.codeproject.com/KB/threads/launchprocess.aspx?msg=3087118我可以從控制檯讀取一行,但如何讓它保持打開狀態?在單獨的類中處理標準錯誤

所以基本上我的問題是如何正確訪問從一個單獨的類內streamreader輸出?

下面的代碼在本地調用時工作得很好

private void exampleErrorRedirection() 
    { 
     Process proc = new Process(); 
     proc.StartInfo.FileName = /exampleconsoleapp.exe; 
     proc.StartInfo.Arguments = "some arguments that work"; 
     proc.StartInfo.RedirectStandardError = true; 
     proc.StartInfo.UseShellExecute = false; 
     proc.StartInfo.CreateNoWindow = true; 
     if (!proc.Start()) 
     { 
      Console.WriteLine("Error starting"); 
      return; 
     } 
     StreamReader reader = proc.StandardError; 
     string line; 
     while ((line = reader.ReadLine()) != null) 
     { 
      textBoxForStandardError.Text = line; 
     } 
     proc.Close(); 
    } 

但是我希望能夠調用時從一個單獨的類重定向輸出。 Atm我只能從控制檯獲得第一行,並且不會更新。

private void exampleErrorRedirection() 
    { 

     exampleDLLFile.startProc ConsoleApp new exampleDLLFile.startProc(); 

     ConsoleApp.Run(); 

     while (convert.line != null) 
     { 
      textBoxForStandardError.Text = ConsoleApp.line; 
     } 
} 

所在班級設有類似的方法,以便:

public class convertFile 
{ 

    public string line; 

    public void Run() 
    { 
     Process proc = new Process(); 
     proc.StartInfo.FileName = /exampleconsoleapp.exe; 
     proc.StartInfo.Arguments = "some arguments that work"; 
     proc.StartInfo.RedirectStandardError = true; 
     proc.StartInfo.UseShellExecute = false; 
     proc.StartInfo.CreateNoWindow = true; 

     if (!proc.Start()) 
     { 
      Console.WriteLine("Error starting"); 

     } 

     StreamReader reader = proc.StandardError; 
     while ((line = reader.ReadLine()) != null) 
     { 
      line = reader.ReadLine(); 
     } 

     proc.Close(); 

    } 
} 

回答

2

您需要添加一個DataReceivedEventHandler該事件Process.ErrorDataReceived

// process is Process 
process.UseShellExecute = false; 
process.RedirectStandardError = true; 
process.ErrorDataReceived += DataReceived; 
process.Start(); 
process.BeginErrorReadLine(); // start asynchronous error read 
. 
. 
. 
process.CancelErrorRead(); 

void DataReceived(object sender, DataReceivedEventArgs e) { 
    // e.Data is line of redirected standard error 
} 
+0

您能解釋的代碼更多 - 感謝提前。 –

+0

我添加了一些代碼,顯示如何正確使用它。你能問一個更具體的問題嗎? – jason

+0

我還不瞭解如何從課堂以外訪問e.Data。認真地nooby,但我掙扎:( –