2012-01-11 10 views
14

Tôi muốn làm một ứng dụng đơn giản sử dụng stdin. Tôi muốn tạo một danh sách trong một chương trình và in nó trong một chương trình khác. Tôi đã đưa ra dưới đây.Lỗi "StandardIn chưa được chuyển hướng" trong .NET (C#)

Tôi không biết liệu app2 có hoạt động hay không trong app1 Tôi nhận được ngoại lệ "StandardIn chưa được chuyển hướng". trên writeline (bên trong tuyên bố foreach). Làm thế nào để tôi làm những gì tôi có ý định?

LƯU Ý: Tôi đã thử đặt UseShellExecute thành true và false. Cả hai đều gây ra ngoại lệ này.

 //app1 
     { 
      var p = new Process(); 
      p.StartInfo.RedirectStandardInput = true; 
      p.StartInfo.FileName = @"path\bin\Debug\print_out_test.exe"; 
      foreach(var v in lsStatic){ 
       p.StandardInput.WriteLine(v); 
      } 
      p.StandardInput.Close(); 
     } 

    //app 2 
    static void Main(string[] args) 
    { 
     var r = new StreamReader(Console.OpenStandardInput()); 
     var sz = r.ReadToEnd(); 
     Console.WriteLine(sz); 
    } 
+1

bạn đang mong đợi để làm p = Process.Start (v); ví dụ..?? cũng đặt p.UseShellExecute = false; – MethodMan

Trả lời

23

Bạn không bao giờ bắt đầu() quy trình mới.

+3

oh ha oh wow yeah đã sửa nó ngay lập tức. –

1

Từ http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.redirectstandardinput.aspx

Bạn phải thiết lập UseShellExecute false nếu bạn muốn thiết lập RedirectStandardInput là true. Nếu không, việc ghi vào luồng StandardInput sẽ ném ra một ngoại lệ.

Người ta có thể giả định nó là sai theo mặc định, dường như không phải như vậy.

+1

Tôi đã làm điều đó. Vấn đề đã quên đi sự bắt đầu() –

10

Bạn phải đảm bảo ShellExecute được đặt thành false để chuyển hướng hoạt động chính xác.

Bạn cũng nên mở một người viết luồng trên đó, bắt đầu quá trình, chờ quá trình thoát và đóng quá trình.

Hãy thử thay thế những dòng này:

 foreach(var v in lsStatic){ 
      p.StandardInput.WriteLine(v); 
     } 
     p.StandardInput.Close(); 

với những:

p.Start(); 
using (StreamWriter sr= p.StandardInput) 
{ 
    foreach(var v in lsStatic){ 
     sr.WriteLine(v); 
    } 
    sr.Close(); 
} 
// Wait for the write to be completed 
p.WaitForExit(); 
p.Close(); 
6

nếu bạn muốn xem một ví dụ đơn giản về cách viết quy trình của bạn để việc sử dụng Suối mã này dưới đây như là một Mẫu cảm thấy tự do thay đổi nó để phù hợp với nhu cầu của bạn ..

class MyTestProcess 
{ 
    static void Main() 
    { 
     Process p = new Process(); 
     p.StartInfo.UseShellExecute = false ; 
     p.StartInfo.RedirectStandardInput = true; 
     p.StartInfo.RedirectStandardOutput = true; 

     p.StartInfo.FileName = @"path\bin\Debug\print_out_test.exe"; 
     p.StartInfo.CreateNoWindow = true; 
     p.Start(); 

     System.IO.StreamWriter wr = p.StandardInput; 
     System.IO.StreamReader rr = p.StandardOutput; 

     wr.Write("BlaBlaBla" + "\n"); 
     Console.WriteLine(rr.ReadToEnd()); 
     wr.Flush(); 
    } 
} 

// Thay đổi để thêm công việc của bạn h cho vòng lặp của bạn