2016-09-21 5 views
0

Просто FYI этот вопрос был повторно отредактирован, чтобы быть более кратким.Отсутствует вывод консоли на проект Winforms, работает над проектом консоли

Я работаю с .NET (будь то помощь в C# или VB, это не имеет значения). У меня есть консольное приложение, то основное:

using System; 

namespace ConsolePrinter 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("Output"); 
      Console.ReadLine(); 
     } 
    } 
} 

В моем приложении Winforms, мне нужно перенаправить стандартную ошибку и стандартный ввод, но не стандартный выход. Стандартный вывод должен отображаться в окне консоли. Сделав простой проект Winforms и запустив вышеуказанный консольный EXE как объект Process, я все еще могу просмотреть вывод консоли в вызываемой консоли. Как только я перенаправляю стандартную ошибку, выход исчезает из окна консоли, и все, что отображается, является пустой консолью.

Вот пример Winforms проекта:

using System; 
using System.Windows.Forms; 
using System.Diagnostics; 

namespace winformstest2 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      Process proc = new Process(); 
      proc.StartInfo.FileName = "ConsolePrinter.exe"; 
      //proc.StartInfo.RedirectStandardError = true; 
      proc.StartInfo.UseShellExecute = false; 

      proc.Start(); 
     } 
    } 
} 

Этот код работает как задумано. Разоружение этой строки с комментариями приводит к ошибке, о которой я говорю.

Я пробовал только прикреплять формы к консольному проекту, но, к сожалению, мне нужно часто показывать и скрывать консоль, поэтому запуск консольного приложения в качестве идеального процесса. Использование Win32 API также было задумано, но пользователь не должен закрывать все приложение, закрывая консоль, которую AllocConsole() и другие вызовы API Win32 могли бы стать би-продуктом их использования.

Любая помощь приветствуется, спасибо!

+1

Непонятно, что происходит - когда вы запускаете приложение командной строки, это начинает * с консольным окном *? Конечно, было бы полезно иметь [mcve] (консольного приложения и крошечное приложение WinForms - ему просто нужно окно с кнопкой для запуска консольного приложения ...) –

+0

Это дубликат http: // stackoverflow .com/вопросы/4362111/как-д-я-шоу-а-консоль вывод окно-в-форм-приложение. Хотя вам придется преобразовать код в vb.net – FloatingKiwi

+0

@JonSkeet Это программа на C++, которая выводит на stdout, ничего особенного. В консольном проекте он выводится непосредственно в окно консоли .net, а Winforms открывает консоль, но ничего не выводит. – KingDan

ответ

1

Оказывается, что причина, у меня было трудное время, воспроизводящий это было то, что он не был код проблема вообще - это было, как код был бежится.

Если вы запускаете программу в отладчике, по какой-то причине установка RedirectStandardError на true изменяет поведение, как отмечено. Вне отладчика - запуск приложения из командной строки или проводника или в Visual Studio с помощью «Пуск без отладки» - вывод появляется по желанию.

Самый простой способ решить это - просто жить без отладки, когда вам нужен выход. Это может быть неудобно, но это, вероятно, будет проще, чем альтернативы.

Другим вариантом было бы перенаправить все и создать собственную мини-консоль в вашем приложении WinForms, конечно. Это было бы более аккуратно и в целом удобнее для пользователя - никаких дополнительных окон не появлялось повсюду - но больше работы. Возможно, стоит подумать, будет ли это многолетнее приложение, часто используемое многими людьми, но не стоит делать иначе.

0

Using this solution должно работать. Обратите внимание, что это приложение Winforms.

using System; 
using System.Diagnostics; 
using System.Runtime.InteropServices; 
using System.Windows.Forms; 

namespace ConsoleExRun 
{ 

    class Program 
    { 
     [DllImport("kernel32.dll", SetLastError = true)] 
     [return: MarshalAs(UnmanagedType.Bool)] 
     static extern bool AllocConsole(); 

     static void Main(string[] args) 
     { 
      AllocConsole(); 

      Process proc = new Process(); 
      proc.StartInfo.UseShellExecute = false; 
      proc.StartInfo.FileName = "ping"; 
      proc.StartInfo.Arguments = "localhost"; 
      proc.StartInfo.RedirectStandardError = true; 
      proc.StartInfo.RedirectStandardInput = true; 

      proc.Start(); 

      Form f = new Form(); 
      Application.Run(f); 
     } 
    } 
} 
+0

Не нужно выделять консоль для * этого * процесса. –

+0

Я буду стрелять в тебя, но я уже прошел через это решение. Закрытие консоли закрывает всю программу, поэтому я могу просто создать консольный проект и приложить к нему формы. – KingDan

+0

@JonSkeet - Из моего кода это было неясно, но это было приложение winforms. Вызов AllocConsole позволяет вывести stdout в окне консоли. Я изменил пример, чтобы сделать это более очевидным. – FloatingKiwi