Взаимодействие с процессами в рамках платформы .NET
Роль процесса Windows
Процессы, домены приложений и контексты объектов.
Понятие "процесса" существовало в операционных системах Windows задолго до появления платформы .NET. Попросту говоря, под процессом понимается выполняющаяся программа. Однако формально процесс — это концепция уровня операционной системы, которая используется для описания набора ресурсов (таких как внешние библиотеки кода и главный поток) и необходимой памяти, используемой выполняющимся приложением. Каждый процесс Windows получает уникальный идентификатор процесса (Process ID — PID) и может независимо загружаться й выгружаться операционной системой (в том числе программно).
Хотя в самих процессах и потоках нет ничего нового, способ, которым с ними можно взаимодействовать в рамках платформы .NET, довольно прилично изменился (в лучшую сторону). Чтобы проложить себе путь к пониманию приемов построения многопоточных сборок (о которых речь пойдет в главе 19), начнем с того, что посмотрим, каким образом можно взаимодействовать с процессами за счет применения библиотек базовых классов .NET.
В пространстве имен System. Diagnostics поставляется набор типов, которые позволяют программно взаимодействовать с процессами и различными связанными с диагностикой средствами вроде системного журнала событий и счетчиков производительности. В настоящей главе нас интересуют только те типы, которые позволяют взаимодействовать с процессами. Некоторые наиболее важные из них перечислим.
Process Предоставляет доступ к локальным и удаленным процессам, а также позволяет запускать и останавливать процессы программным образом
ProcessModule Представляет модуль (* . dll или * . ехе), который должен загружаться в определенный процесс. Важно понимать, что этот тип может применяться для представления любого модуля — COM-, .NET- или традиционного двоичного на базе С
ProcessModuleCollection Позволяет создавать строго типизированную коллекцию объектов ProcessModule Класс System. Diagnostics . Process позволяет анализировать процессы, которые выполняются на какой-то определенной машине (локальной или удаленной). Кроме того, в нем есть члены, которые позволяют программно запускать и останавливать процессы, просматривать приоритет процесса, а также получать список активных потоков 586 Часть IV. Программирование с использованием сборок .NET и/или модулей, которые были загружены в данный процесс. Некоторые важные свойства:
ExitTime | Это свойство позволяет извлекать значение даты и времени, ассоциируемое с процессом, который завершил свою работу (и представленное типом DateTime). |
Handle | Это свойство возвращает дескриптор (представляемый с помощью IntPtr), который был назначен процессу операционной системой. Может оказаться полезным при создании приложений .NET, нуждающихся во взаимодействии с неуправляемым кодом. |
Id | Это свойство позволяет получать идентификатор (PID) соответствующего процесса. |
MachmeName | Это свойство позволяет получать имя компьютера, на котором выполняется соответствующий процесс. |
MainWmdowTitle | Это свойство позволяет получать заголовок главного окна процесса (если у процесса нет главного окна, возвращается пустая строка). |
Помимо перечисленных выше свойств, класс System. Diagnostics . Process имеет несколько полезных методов,
CloseMainWindow() | Этот метод позволяет завершать процесс, обладающий пользовательским интерфейсом, за счет отправки в его главное окно сообщения о закрытии. |
GetCurrentProcess() | Этот статический метод возвращает новый объект Process, представляющий процесс, который является активным в текущий момент. |
Управление запуском процесса с использованием класса ProcessStartlnfо
Метод Start () может принимать тип System. Diagnostics . ProcessStartlnf и предоставлять дополнительные фрагменты информации относительно запуска определенного процесса.