Классы .net для работы с процессами

№11-1,

Технические науки

В статье рассматриваются классы .NET для работы с процессами.

Похожие материалы

Пространство имён System.Diagnostics содержит 7 классов и 2 перечисления.

Для управления внешними (по отношению к Си-программам) программами основными являются 2 класса: Process и ProcessStartlnfo.

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

В MSDN каждый класс характеризуется по типовой схеме: общее описание класса, перечисление членов класса (конструктор, методы, свойства, события), подробное описание членов класса с примерами их использования. Такая же схема выдерживается и при описании классов Process и ProcessStartlnfo.

Электронной вычислительной машине для выполнения любой программы нужны определённые ресурсы: память, устройства, файлы, адресное пространство, процессорное время, и др. Программа, которой операционная система выделила необходимые для работы ресурсы, образует процесс, а точнее - процесс операционной системы, или системный процесс.

Последовательность создания процесса в С#-программе предусматривает создание экземпляра класса (компонента Process) и связывание этого экземпляра с системным процессом (т.е. процессом ОС).

Создание экземпляра производится конструктором класса. При этом экземпляру (компоненту, или созданному объекту) присваивается имя. Если процесс создаётся в классе MyProcess и ему присваивается имя processl, то делается это с использованием оператора new:

MyProcess processl = new MyProcess();

Связывание создаваемого процесса с системным производится методом Start().

При создании процесса обязательно должно быть определено значение свойства Startlnfo.FileName. Обычно это свойство определяется перед связыванием с системным процессом (т. е. перед командой Start()) и определяет ресурс процесса - используемую программу или документ, обрабатываемый этой программой.

Например, создадим процесс из программы 100.cs, выводящей на экран help программы сетевого клиента ОС - cliconf.chm:

using System;
class Class1
{
[STAThread]
static void Main(string[]   args)
{
//  Создать  новый процесс System.Diagnostics.Process proc = new System.Diagnostics.Process();
//  Приложение которое будем запускать proc.StartInfo.FileName = "cliconf.chm";
proc.Start();
Console.ReadLine();
}
}

В этой программе конструктор System.Diagnostics.Process() создаёт экземпляр класса System.Diagnostics.Process с именем proc. Затем определяется требуемый этому процессу ресурс FileName = " cliconf.chm", и запускается метод Start().

 

Во время компиляции создаётся программа 100.exe,

Во время компиляции создаётся программа 100.exe

запуск которой приводит к появлению соответствующего системного процесса и появлению окна программы сетевого клиента:

запуск которой приводит к появлению соответствующего системного процесса и появлению окна программы сетевого клиента

Системный процесс - это выполняющееся на компьютере приложение. Из C#-программы доступ к нему можно получить с помощью компонента Process (так в MSDN называется экземпляр класса Process, создаваемый с помощью конструктора).

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

Для запуска процессов в классе Process может использоваться 6 методов Start:

Start()

Запускает ( или начинает заново использовать) ресурс процесса, определенный свойством Startlnfo этого компонента Process, и связывает его с компонентом.

Start(ProcessStartlnfo)

Запускает ресурс процесса, определенный параметром, содержащим стартовую информацию процесса (например, имя файла процесса для запуска), и связывает ресурс с новым компонентом Process.

Start(String)

Запускает ресурс процесса путем указания имени документа или файла приложения и связывает ресурс с новым компонентом Process.

Start(String, String)

Запускает ресурс процесса путем указания имени приложения и множества аргументов командной строки и связывает ресурс с новым компонентом Process.

Start(String, String, SecureString, String)

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

Start(String, String, String, SecureString, String)

Запускает ресурс процесса путем указания имени приложения, набора аргументов командной строки , имени пользователя, пароля и домена и связывает ресурс с новым компонентом Process.

Среди этих методов только метод Start() не является статическим. Перед его использованием необходимо создать экземпляр класса Process, в свойстве Startlnfo надо задать информацию для определения запускаемого ресурса процесса. Причём, в этом свойстве можно задать всё, что можно передать программе в командной строке (обязательным является только значение свойства FileName).

Рассмотрим наиболее важные классы, свойства и методы, используемые в пространстве имён System.Diagnostics.

Свойство FileName

Может определять либо исполнимый файл, либо ресурс для него (т.е. обрабатываемый документ). Что именно должно быть задано этим свойством, уточняется свойством UseShellExecute класса ProcessStartlnfo.

Класс ProcessStartlnfo

Используется совместно с классом Process. Например, класс Process имеет свойство Startlnfo. В MSDN при описании этого свойства говорится, что значение его определяется его типом: System.Diagnostics.ProcessStartlnfo. И далее объясняется, что класс ProcessStartlnfo представляет данные для запуска процесса. Из этого описания следует, что эти два класса так близки, что в MSDN они почти не различаются.

Класс Process

Имеет свойства, характеризующие заголовок системного процесса, его идентификатор (PID), приоритет, объём занимаемой физической памяти, состав используемых модулей, время начала и окончания процесса, и другие параметры.

Свойство StartInfo

Позволяет передавать параметры запускаемому процессу. Основным является параметр FileInfo. Это может быть исполняемая программа ОС или ресурс.

В составе Startlnfo в свойстве Verb можно указать команду, которую должна выполнить над ресурсом операционная система. Например, при обработке файла, имеющего расширение .doc, можно выполнить команду "Print", а при обработке файла с расширением .exe можно выполнить команду runas.

Состав команд можно определить свойством Verbs.

Параметры, указываемые в свойстве StartInfo, можно изменить только до момента вызова метода Start. После запуска процесса изменение значений StartInfo не влияет на запущенный процесс.

Для управления машинными программами представляют интерес такие свойства, как Standardlnput, StandardOutput, StandardError (позволяют взаимодействовать со стандартными потоками ввода, вывода и ошибок).

Свойство RedirectStandardError

Позволяет перенаправить поток ошибок, возникающих при выполнении процесса. Можно фильтровать текст, форматировать его, записывать в консоль или предусмотренный для этого файл.

Для изменения направленности потока ошибок свойству RedirectStandardError надо присвоить значение true, и одновременно необходимо запретить использование средств операционной системы, присвоив свойству UseShellExecute значение false.

Свойство RedirectStandardInput

Позволяет перенаправить входной поток.

Стандартным устройством ввода является клавиатура. Его можно заменить на файл - при этом свойству RedirectStandardInput присваивается значение true.

В следующем примере программой 116.cs перенаправляется поток процесса Standardlnput - запускается команда sort с перенаправленным вводом. (Команда sort является консольным приложением, считывающим и сортирующим введённый текст).

using System;
using System.10;
using System.Diagnostics;
namespace  Prосеss_StandardInput_Sample {
class  StandardlnputTest {
static void Main() {
Console.WriteLine("Готовимся сортировать  строки текста!...");
//  Старт процесса Sort.ехе с перенаправлением входного потока.
//  Команда sort используется для сортировки вводимого  текста.
Process myProcess = new Process ( ) ;
myProcess.StartInfо.FileName =  "Sort.exe"; 
myProcess.StartInfо.UseShe11Execute =  false; 
myProcess.StartInfо.Redirect Standardlnput = true;
myProcess.Start();
StreamWriter myStreamWriter = myProcess.Standardlnput;
//  Приглашение ко вводу строки исходного  текста для сортировки.
//  Записываем каждую строку в поток Standardlnput
//  с помощью команды sort.
String inputText;
int numLines = 0;
do
{
Console.WriteLine("Введите строку текста   (или нажмите клавишу    Enter для остановки):");
inputText = Console.ReadLine() ;
if   (inputText.Length > 0)
{
numLines ++;
myStreamWriter.WriteLine(inputText);
}
}  while   (input Text.Length   != 0);
//  Вывод результата на консоль.
i f   (numLines > 0)
{
Console .WriteLine (11   { 0 }  отсортированные строки текста 11,   numLines ) ;
Console .WriteLine ( "------------------------") ;
}
else {
Console .WriteLine (11  Нет введённого  текста" ) ;
}
//  Закрываем входной поток.
//  После закрытия потока команда    sort
//  распечатает отсортированные строки на консоли.
myStreamWriter.Close();
//  Ожидаем окончания процесса печати. myProcess.WaitForExit(); myProcess.Close() ;
}
}
}

Если эту программу исполнить без перенаправления, т.е. закомментировать две строки:

myProcess.Startlnfo.FileName = "Sort.exe"; 
//myProcess.Startlnfo.UseShellExecute = false; 
//myProcess.Startlnfo.Redirect Standardlnput = true;
myProcess.Start();

то программа 116.exe будет выполняться в окне Visual Studio Command Prompt:

 

 а строки для ввода будут восприниматься из окна запущенной программы sort.exe:  

 

Свойство RedirectStandardOutput

Это свойство позволяет перенаправить выходной поток. Обычно выводимый в выходной поток текст поступает в консоль (выводится на экран). Перенаправление потока эквивалентно командам ">", "»" или "|" операционной системы. С помощью перенаправления потока можно фильтровать текст, форматировать его, записывать в назначенный файл.

ProcessStandardOutput - это стандартный поток компонента Process.

Свойство RedirectStandardOutput - это перенаправление стандартного потока. Если поток надо перенаправить, то это свойство должно иметь значение true. Если перенаправлять ничего не надо, свойство должно быть равно false.

Совместно с RedirectStandardOutput устанавливается свойство UseShellExecut. При RedirectStandardOutput = true свойство UseShellExecut должно быть false.

Пример:

using System;
using System.Diagnostics;
using System.10;
namespace RunProcess {
class Classl {
static void structura(string dir) {
//Структура папки в виде дерева ProcessStartlnfо  startinfo; Process process = null;
string command,   stdoutline;
StreamReader stdoutreader;
//  Команда которую будем выполнять command = "tree  ";
try {
startinfo = new ProcessStartInfo(); 
//  Запускаем через cmd startinfo.FileName = "cmd.exe"; 
//  Ключ /c - выполнение команды 
//  Кроме команды можно вставить и необходимые параметры startinfo.Arguments = "/C  "  + command + dir;
//  Не используем shellexecute startinfo.UseShellExecute = false; 
//  Перенаправить  вывод на обычную консоль
startinfo.RedirectStandardOutput = true;
//  Стартуем process = Process.Start(startinfo);
//  Получаем вывод stdoutreader = process.StandardOutput;
while((stdoutline=stdoutreader.ReadLine())!= null) {
//  Выводим
Console.WriteLine(stdoutline);
}
stdoutreader.Close(); stdoutreader = null;
}
catch {
throw;
}
finally {
if   (process   != null) {
//  Закрываем process.Close();
}
//  Освобождаем process = null; startinfo = null;
}
Console.ReadLine();
}
[STAThread]
static void Main(string[] args) {
string dir = args[0]; structura(dir) ; }
} 
}

Свойство StandardOutputEncoding

Возвращает или задает предпочтительную кодировку для стандартного вывода.

Если значение этого свойства равно null, процесс использует для стандартного вывода соответствующую кодировку по умолчанию.

Свойство ProcessStartlnfo.UseShellExecut

Возвращает или задает значение, позволяющее определить, нужно ли использовать оболочку операционной системы для запуска процесса.

Для использования оболочки системы при запуске процесса, свойство должно иметь значение true. В противном случае процесс создаётся непосредственно из исполняемого файла, а возможности ОС не используются.

При использовании оболочки ОС запускать процесс можно по имени обрабатываемого документа. По этому имени оболочка ОС определяет тип документа и находит в реестре, какая программа является обработчиком документов данного типа, после чего -запускает эту программу и передаёт ей в качестве параметра обрабатываемый файл.

Кроме того, при использовании оболочки ОС файл может в некоторых случаях задаваться без указания пути к нему. Если путь не указан, файл сначала ищется в текущем каталоге, а при отрицательном исходе - в каталогах, перечисленных в системной переменной path.

К особенностям использования оболочки ОС относится и способность ОС определять приоритет запуска файлов, имеющих

одинаковые имена, но разные расширения. Например, в текущем каталоге хранится три файла: "a.cmd", "a.com" и "a.exe". Если процесс запускается без указания расширения, только по имени файла, при UseShellExecute = true операционная система сначала выполнит файл с расширением ".com", затем - ".exe", и только затем - ".cmd".

При UseShellExecute = false файлы будут выполняться в том порядке, в котором они были записаны в каталог.

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

Свойство ProcessStartInfo.Verb

Возвращает или задает команду, которую необходимо использовать при открытии приложения или документа, указанного в свойстве FileName.

Каждое расширение файла имеет свой набор команд (этот набор можно получить с помощью свойства Verbs). Примерами команд могут служить "Print", "Edit", "Open", "OpenReadOnly" и другие.

При использовании свойства Verb в значении свойства FileName обязательно нужно указывать расширение файла, так как именно по расширению определяется допустимый состав команд.

Свойство ProcessStartInfo.Verbs

Возвращает набор команд, которые связаны с типом файла, заданным в свойстве FileName.

Пример:

В следующем примере кода выводятся команды, заданные для выбранного типа файла, определяемого его расширением.

Пример:

//Программа 102 .exe,   определяющая состав допустимых команд
//для заданного  типа файла.
using System;
using System.10;
using System.Diagnostics;
using System.Text;
using System.Windows.Forms;
class  Processinformation {
[STAThread]
static void Main(string[ ]   args) {
//  Создать  новый процесс
System.Diagnostics.Process proc = new System.Diagnostics.Process();
//  Приложение которое будем запускать proc.Startlnfo.FileName =  "cmd.exe";
proc.Start();
int i = 0;
foreach   (String verb in proc.Startlnfo.Verbs) {
//  Display the possible verbs. Console.WriteLine("     {0}.   {1}" ,   i . ToString() ,   verb) ; i + +;
}
Console.ReadLine();
}
}

Для файла .jpg допустимыми будут команды:

При запуске программы 102.exe для файла cmd.exe получаем:

Запрашиваем help команды runas:

Свойство ProcessStartlnfo.WorkingDirectory

Возвращает или задает начальный каталог для запускаемого процесса.

Если свойство не задано, по умолчанию рабочим каталогом является %SYSTEMROOT%\system 32.

Если значением свойства является пустая строка, исполняемый файл находится в текущем каталоге.