Die Herausforderung:
Eine konsequent zuverlässige Methode, um die übergeordnete Prozess -ID eines Prozesses in .NET -Anwendungen zu erhalten, hat sich als schwierig erwiesen. Viele vorhandene Ansätze hängen von plattformspezifischen Aufrufen ab (P/Invoke), die komplex und weniger tragbar sein können.
Eine robuste Lösung mit P/Invoke:
Trotz der Komplexität bietet eine gut strukturierte P/Invoke-Lösung eine außergewöhnliche Zuverlässigkeit in 32-Bit- und 64-Bit-Systemen:
<code class="language-csharp">public static class ParentProcessHelper { [DllImport("ntdll.dll")] private static extern int NtQueryInformationProcess(IntPtr processHandle, int processInformationClass, ref PROCESS_BASIC_INFORMATION processInformation, int processInformationLength, out int returnLength); public static Process GetParentProcess() { return GetParentProcess(Process.GetCurrentProcess().Handle); } public static Process GetParentProcess(int processId) { Process process = Process.GetProcessById(processId); return GetParentProcess(process.Handle); } public static Process GetParentProcess(IntPtr handle) { PROCESS_BASIC_INFORMATION pbi = new PROCESS_BASIC_INFORMATION(); int returnLength; int status = NtQueryInformationProcess(handle, 0, ref pbi, Marshal.SizeOf(pbi), out returnLength); if (status != 0) throw new Win32Exception(status); try { return Process.GetProcessById(pbi.InheritedFromUniqueProcessId.ToInt32()); } catch (ArgumentException) { return null; // Parent process not found } } // Structure definition (required for P/Invoke) [StructLayout(LayoutKind.Sequential)] private struct PROCESS_BASIC_INFORMATION { public IntPtr Reserved1; public IntPtr PebBaseAddress; public IntPtr Reserved2; public IntPtr Reserved3; public IntPtr UniqueProcessId; public IntPtr InheritedFromUniqueProcessId; } }</code>
Diese verfeinerte Methode identifiziert den übergeordneten Prozess für Ihre .NET -Anwendung oder eine bestimmte Prozess -ID effizient. Die Fehlerbehandlung ist enthalten, um Situationen, in denen der übergeordnete Prozess nicht mehr ausgeführt wird, anmutig verwaltet. Beachten Sie, dass die PROCESS_BASIC_INFORMATION
Struktur für die korrekte Interoperabilität mit der nativen NtQueryInformationProcess
-Funktion entscheidend ist.
Das obige ist der detaillierte Inhalt vonWie kann ich mit dem Managed Code zuverlässig eine übergeordnete Prozess -ID in .NET zuverlässig erhalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!