Взаимодействие с процессами в .NET
86C# --- Сборки .NET --- Взаимодействие с процессами в .NET
Хотя в самих процессах и потоках нет ничего нового, способ, которым с ними можно взаимодействовать в рамках платформы .NET, довольно прилично изменился (в лучшую сторону). Чтобы проложить себе путь к пониманию приемов построения многопоточных сборок, начнем с того, что посмотрим, каким образом можно взаимодействовать с процессами за счет применения библиотек базовых классов .NET.
В пространстве имен System.Diagnostics поставляется набор типов, которые позволяют программно взаимодействовать с процессами и различными связанными с диагностикой средствами вроде системного журнала событий и счетчиков производительности. Нас интересуют только те типы, которые позволяют взаимодействовать с процессами. Некоторые наиболее важные из них перечислены ниже:
- Process
Предоставляет доступ к локальным и удаленным процессам, а также позволяет запускать и останавливать процессы программным образом
- ProcessModule
Представляет модуль (*.dll или *.ехе), который должен загружаться в определенный процесс. Важно понимать, что этот тип может применяться для представления любого модуля — COM, .NET или традиционного двоичного на базе С
- ProcessModuleCollection
Позволяет создавать строго типизированную коллекцию объектов ProcessModule
- ProcessStartInfо
Позволяет указывать набор значений, которые должны использоваться при запуске процесса посредством метода Process.Start()
- ProcessThread
Представляет поток внутри определенного процесса. Следует иметь в виду, что этот тип применяется для диагностики набора потоков в процессе, но не для ответвления внутри него новых потоков
- ProcessThreadCollection
Позволяет создавать строго типизованную коллекцию объектов ProcessThread
Класс System.Diagnostics.Process позволяет анализировать процессы, которые выполняются на какой-то определенной машине (локальной или удаленной). Кроме того, в нем есть члены, которые позволяют программно запускать и останавливать процессы, просматривать приоритет процесса, а также получать список активных потоков или модулей, которые были загружены в данный процесс. В таблице перечислены некоторые наиболее важные свойства и методы класса System.Diagnostics.Process:
Свойство или метод | Описание |
ExitTime | Позволяет извлекать значение даты и времени, ассоциируемое с процессом, который завершил свою работу (и представленное типом DateTime). |
Handle | Это свойство возвращает дескриптор (представляемый с помощью IntPtr), который был назначен процессу операционной системой. Может оказаться полезным при создании приложений .NET, нуждающихся во взаимодействии с неуправляемым кодом. |
Id | Позволяет получать идентификатор (PID) соответствующего процесса. |
MachineName | Позволяет получать имя компьютера, на котором выполняется соответствующий процесс. |
MainWindowTitle | Позволяет получать заголовок главного окна процесса (если у процесса нет главного окна, возвращается пустая строка). |
Modules | Позволяет получать доступ к строго типизованной коллекции ProcessModuleCollection, представляющей набор модулей (*.dll или *.ехе), которые были загружены в рамках текущего процесса. |
ProcessName | Позволяет получать имя процесса (которое совпадает с именем самого приложения). |
Responding | Позволяет получать значение, показывающее, реагирует ли пользовательский интерфейс соответствующего процесса на действия пользователя (и не находится ли он в текущий момент в "зависшем" состоянии). |
StartTime | Позволяет получать информацию о том, когда был запущен соответствующий процесс (представленную типом DateTime). |
Threads | Позволяет получать информацию о том, какие потоки выполняются в рамках соответствующего процесса (в виде коллекции объектов ProcessThread). |
CloseMainWindow() | Этот метод позволяет завершать процесс, обладающий пользовательским интерфейсом, за счет отправки в его главное окно сообщения о закрытии. |
GetCurrentProcess() | Этот статический метод возвращает новый объект Process, представляющий процесс, который является активным в текущий момент. |
GetProcesses() | Этот статический метод возвращает массив новых объектов Process, которые выполняются на текущей машине. |
Kill() | Этот метод позволяет немедленно останавливать соответствующий процесс. |
Start() | Этот метод позволяет запускать процесс. |
Давайте рассмотрем пример:
using System;
using System.Linq;
using System.Diagnostics;
namespace ConsoleApplication1
{
class Program
{
static void Main()
{
// Используем LINQ-запрос для получения
// списка всех используемых процессов
var allProcess = from pr in Process.GetProcesses(".")
orderby pr.Id select pr;
int i = 0;
foreach (var proc in allProcess)
{
i++;
string infoproc = string.Format(@"-->{0}:
PID: {1}
Name: {2}
",i,proc.Id,proc.ProcessName);
Console.Write(infoproc);
}
Console.ReadLine();
}
}
}
