Класс Process — запуск сторонних приложений в C#

Класс Process предоставляет доступ к локальным и удаленным процессам, а также позволяет запускать и останавливать локальные системные процессы. Этот класс удобно использовать в том случае, если Вам необходимо запустить какой-либо сторонний процесс (приложение) и получить от этого приложения данные.

Рассмотрим несколько примеров работы с классом Process.

Как в C# запустить стороннюю программу

Допустим, нам необходимо из своего консольного приложения на C# запустить «Блокнот» (notepad.exe). С классом Process это можно сделать следующим образом:

using System.Diagnostics;
namespace ConsoleApp2
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.ReadKey();
            Process process = Process.Start("notepad.exe");
            try
            {
                process.WaitForExit();
                Console.WriteLine("Внешний процесс завершен");
            }
            finally
            {
                process.Dispose(); 
            }
            
        }
    }
}

Вначале мы подключили пространство имен System.Diagnostics в котором содержится класс Process. Затем, приложение ожидает нажатия любой кнопки и запускает новый процесс notepad.exe, используя одну из версий статического метода Start.

Process process = Process.Start("notepad.exe");

Этот метод возвращает объект типа Process и, так как Process реализует интерфейс IDisposable, то мы должны прямо или косвенно освободить память и ресурсы используемые объектом после окончания его работы. Поэтому далее мы поместили код в блок try...finally для того, чтобы напрямую освободить ресурсы. Внутри блока мы ожидаем пока запущенный процесс не завершит свою работу:

process.WaitForExit();

Как только «Блокнот» будет закрыт, в консоль выведется сообщение о том. что внешний процесс завершил свою работу.

Как в C# открыть URL в браузере по умолчанию

Для того, чтобы открыть какой-либо URL в браузере по умолчанию достаточно сделать следующий вызов метода Start у класса Process:

using Process process = Process.Start("explorer", "https://csharp.webdelphi.ru");

здесь второй параметр метода — это аргументы командной строки с которыми запускается приложение. И далее, стоит рассмотреть ещё один более сложный пример — запуск приложения с параметрами.

Как в C# запустить стороннюю программу с параметрами

В предыдущих примерах мы не использовали ничего, кроме статического метода Start() у класса Process. Однако этот класс позволяет сделать более «тонкую» настройку запускаемого внешнего процесса.

Внешнее консольное приложение для запуска

Для демонстрации следующего примера я написал небольшое консольное приложение которое получает в параметрах два числа, перемножает их и выводит результат в консоль:

namespace Multiply
{
    internal class Program
    {
        static void Main(string[] args)
        {
            if (args.Length < 2) 
            {
                Console.Error.WriteLine("Ошибка: недостаточно данных для вычислений");
                return;
            }

            if (int.TryParse(args[0], out int first) == false)
            {
                Console.Error.WriteLine("Ошибка: в первом параметре содержится не число");
                return;
            }

            if (int.TryParse(args[1], out int second) == false)
            {
                Console.Error.WriteLine("Ошибка: во втором параметре содержится не число");
                return;
            }

            Console.WriteLine($"{first * second}");
        }
    }
}

Само приложение я поместил в папку c:\temp\

Запуск стороннего приложения с параметрами

Чтобы запустить в C# стороннее приложение с параметрами мы можем создать экземпляр класс Process и настроить его свойства следующим образом:

using System.Diagnostics;
namespace ConsoleApp2
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello, World!");
            Console.ReadKey();
            using Process process = new Process();
            {
                process.StartInfo.FileName = @"c:\temp\Multiply.exe"; //путь к приложению, которое будем запускать
                process.StartInfo.WorkingDirectory = @"c:\temp\"; //путь к рабочей директории приложения
                process.StartInfo.Arguments = "7 3"; //аргументы командной строки (параметры)
                process.Start();	
            };
        }
    }
}

После запуска приложения мы увидим в консоли результат вычисления 7х3, то есть число 21. Рассмотрим другие полезные возможности использования класса Process.

Перенаправление стандартных потоков ввода/вывода внешнего приложения

Про перенаправление потоков ввода-вывода в консольных приложениях C# мы говорили здесь. Класс Process позволяет, при необходимости, перенаправить стандартные потоки ввода-вывода внешнего приложения в свой поток StandardOutput. Рассмотрим как это сделать, используя разработанное приложение для перемножения двух чисел. Наше приложение может не только перемножать числа, но и, при необходимости, выводить в консоль три типа ошибок: когда количество параметров недостаточно и когда один из параметров не является числом. Перепишем пример работы с Process, представленный выше так, чтобы вся информация о работе внешнего приложения выводилась в поток Process.StandardOutput:

using System.Diagnostics;
namespace ConsoleApp2
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello, World!");
            Console.ReadKey();
            using Process process = new Process();
            {
                process.StartInfo.FileName = @"c:\temp\Multiply.exe"; 
                process.StartInfo.WorkingDirectory = @"c:\temp\"; 
                process.StartInfo.Arguments = "2 3"; 
                process.StartInfo.RedirectStandardOutput = true;
                process.StartInfo.RedirectStandardError= true;
                process.OutputDataReceived += DataReceivedEventHandler; //обработчик события при получении очередной строки с данными
                process.ErrorDataReceived += ErrorReceivedEventHandler; //обработчик события при получении ошибки
                
                process.Start(); //запускаем процесс
                process.BeginOutputReadLine(); //начинаем считывать данные из потока 
                process.BeginErrorReadLine(); //начинаем считывать данные об ошибках 
                process.WaitForExit(); //ожидаем окончания работы приложения, чтобы очистить буфер
                process.Close(); //завершает процесс
            };
        }

        static void DataReceivedEventHandler(object sender, DataReceivedEventArgs e)
        {
            if (e.Data != null) 
            {
                Console.WriteLine($"Внешний процесс вернул данные: {e.Data}");
            }
            
        }

        static void ErrorReceivedEventHandler(object sender, DataReceivedEventArgs e)
        {
            if (e.Data != null) 
            {
                Console.WriteLine($"Внешний процесс вернул ошибку: {e.Data}");
            }
            
        }
    }
}

Во-первых, мы создали и назначили два обработчика событий:

  1. Метод DataReceivedEventHandler — обработчик события при поступлении в поток StandardOutput очередной строки с данными
  2. Метод ErrorReceivedEventHandler — обработчик события при возникновении ошибки.

Эти обработчики мы назначили соответствующим событиям класса Process:

process.OutputDataReceived += DataReceivedEventHandler; 
process.ErrorDataReceived += ErrorReceivedEventHandler;

Во-вторых, мы перенаправили стандартные потоки выводи и ошибок из внешнего приложения в наше:

process.StartInfo.RedirectStandardOutput = true; 
process.StartInfo.RedirectStandardError= true;

В-третьих, мы запустили операции чтения данных из потока вывода и потока ошибок:

process.BeginOutputReadLine(); 
process.BeginErrorReadLine();

Теперь можно запустить приложение и посмотреть на результат. Результат, когда в качестве аргумента для стороннего приложения задано не число:

Внешний процесс вернул ошибку: Ошибка: в первом параметре содержится не число

Результат, когда заданы верные параметры:

Внешний процесс вернул данные: 12

Как можно видеть по результатам, обработчики события работают корректно, что говорит о том, что мы перенаправили стандартные потоки ввода-вывода из внешнего консольного приложения в наше.

Другие возможности класса Process

Класс Process не зря содержится в пространстве имен System.Diagnostics. Класс Process — это полезное средство не только для запуска, остановки и контроля внешних процессов, но и для их мониторинга.

Класс Process можно использовать для получения списка запущенных процессов.

Класс Process используется для доступа к системным процессам.

После инициализации Process его можно использовать для получения сведений о запущенном процессе. Эти сведения включают в себя набор потоков, загруженные модули (файлы .dll и .exe) и информацию о производительности, например объем памяти, используемой процессом.

Итого

Используя класс Process мы можем запускать сторонние приложения из C#, открывать различные документы и ссылки на ресурсы в приложениях по умолчанию, перенаправлять потоки ввода-вывода из внешних приложений в свои, а также, при необходимости, получать различную диагностическую информацию о процессах запущенных в операционной системе.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии