Взаимодействие с процессами в .NET

86

Хотя в самих процессах и потоках нет ничего нового, способ, которым с ними можно взаимодействовать в рамках платформы .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();
        }
    }
}
Программное получение списка процессов Windows
Пройди тесты
Лучший чат для C# программистов