Часть вашей проблемы может заключаться в том, что класс ProcessInfo
в вашем примере является частью пространства имен System.Web
.Он (цитируя MSDN) «возвращает информацию о рабочих процессах ASP.Net, которые выполняются в рамках модели процессов ASP.Net».Казалось бы, это вряд ли вернет что-либо ужасно полезное для вашего приложения командной строки.
Вам необходимо использовать WMI через пространство имен System.Management.Следующий пример должен выполнить трюк и получить объект System.Diagnostics.Process для непосредственного родителя текущего процесса.В этом примере используется метод Process.WaitForExit()
, но подключение обработчика событий также должно работать.
Тем не менее, особенно если вы говорите о консольном приложении, следует отметить, что непосредственным родительским процессом является не обязательно процесс, который фактически породил текущий процесс.Если процесс A порождает консольное приложение B процесса непосредственно с ProcessStartInfo
, указывающим UseShellExecute=false
, то A будет непосредственным родителем B. Однако, если процесс A порождает процесс B (консольное приложение) с ProcessStartInfo
, указывающим UseShellExecute=true
,тогда процесс A не будет непосредственным родителем процесса B: между A и B. будет промежуточный процесс (cmd.exe
). И если вы используете пакетные файлы * .cmd или код PowerShell...это может быть сложнее.
Так что вам может понадобиться пройти дальше по дереву процессов, чтобы найти интересующий родительский элемент.
Кроме того, поскольку вы не породили родительский процессу вас не будет доступа к коду условия (выхода) родительского процесса после его завершения.При попытке получить доступ к свойству ExitCode родительского процесса выдается недопустимое исключение операции.
using System;
using System.Collections;
using System.Diagnostics;
using System.Management;
namespace WaitOnParentProcessSample
{
class Program
{
static int Main( string[] argv )
{
using ( Process parentProcess = GetParentProcess() )
{
Console.WriteLine( "Waiting for parent process (pid:{0}) to exit..." , parentProcess.Id );
parentProcess.WaitForExit();
Console.WriteLine( "Parent Process Has exited. Condition code cannot be determined" );
}
return 0;
}
private static Process GetParentProcess()
{
Process parentProcess = null;
using ( Process currentProcess = Process.GetCurrentProcess() )
{
string filter = string.Format( "ProcessId={0}" , currentProcess.Id );
SelectQuery query = new SelectQuery( "Win32_Process" , filter );
using ( ManagementObjectSearcher searcher = new ManagementObjectSearcher( query ) )
using ( ManagementObjectCollection results = searcher.Get() )
{
if ( results.Count>0 )
{
if ( results.Count>1 )
throw new InvalidOperationException();
IEnumerator resultEnumerator = results.GetEnumerator();
bool fMoved = resultEnumerator.MoveNext();
using ( ManagementObject wmiProcess = (ManagementObject)resultEnumerator.Current )
{
PropertyData parentProcessId = wmiProcess.Properties["ParentProcessId"];
uint pid = (uint)parentProcessId.Value;
parentProcess=Process.GetProcessById( (int)pid );
}
}
}
}
return parentProcess;
}
}
}