Для того, что бы запустить приложение из кода, существует класс System.Diagnostics.Process.
Я запускал консольное приложение через WEB-страницу. То, что консольное приложение выводит в стандартный вывод надо было собирать в лог-файл. Весь код страницы приводить не буду, приведу только ту часть, которая запускает приложение и пишет лог:
private string path_log = "C:\\parser\\"; // Папка, где лежат логи парсера
private string path_ex = "C:\\parser\\log\\"; // Папка, где лежит экзешник парсера
private string file_name = "log.txt"; // Лог-файл
private System.IO.StreamWriter sw_log = null;
private System.Diagnostics.Process parser = null;
private void StartParser()
{
parser = new Process();
parser.StartInfo.FileName = path_ex + "parser.exe";
parser.StartInfo.UseShellExecute = false;
// Указываем, что будем хватать стандартный вывод
parser.StartInfo.RedirectStandardOutput = true;
// А так же кодировку, в которой данные выходят в стандартный вывод
parser.StartInfo.StandardOutputEncoding = System.Text.Encoding.UTF8;
parser.StartInfo.CreateNoWindow = true;
parser.StartInfo.WorkingDirectory = path_ex;
// ВАЖНОЕ СВОЙСТВО!! Без него не будет срабатывать событие parser.Exited
parser.EnableRaisingEvents = true;
// Событие, которое срабатывает, когда в стандартный вывод поступает инфа
parser.OutputDataReceived += new DataReceivedEventHandler(parser_OutputDataReceived);
parser.Exited += new EventHandler(parser_Exited);
// ПУСК!
parser.Start();
sw_log = new System.IO.StreamWriter(path_log + "\\" + file_name + ".txt");
// Говорим, что пора ловить данные из стандартного вывода
parser.BeginOutputReadLine();
// Возвращаю ID процесса
log_content.InnerHtml = string.Format("Parser process ID: {0}", parser.Id);
}
// Пишем стандартный вывод процесса в лог-файл.
// Я сделал, что бы файл после каждой строчки флашился, мне просто так надо было, не принципиально
private void parser_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
if (!String.IsNullOrEmpty(e.Data))
{
sw_log.WriteLine(e.Data);
sw_log.Flush();
}
}
// Закрыаем все и освобождаем
private void parser_Exited(object sender, EventArgs e)
{
parser.Close();
parser.Dispose();
sw_log.Close();
sw_log.Dispose();
}
В общем все. Из возможно полезного в классе
Process есть метод
WaitForExit() - который будет ждать, когда запускаемый процесс завершит работу. Так же как стандартный вывод можно ловить инфу из вывода ошибки, для этого есть событие
ErrorDataReceived и метод
BeginErrorReadLine. Так же там много всякой отладочной инфы по процессу. Подробности тут:
http://msdn.microsoft.com/en-us/library/system.diagnostics.process.aspx.