挑戰:
找到一種始終可靠的方法以在.NET應用程序中獲取流程的父進程ID已被證明很困難。 許多現有的方法取決於特定於平台的調用(P/Invoke),這可能是複雜且便攜式的。 使用P/Invoke:>一個可靠的解決方案
儘管有復雜性,但結構良好的P/Invoke解決方案可在32位和64位系統上提供出色的可靠性:
此精製方法有效地標識了您的.NET應用程序或任何指定的過程ID的父進程。 包括錯誤處理,以優雅地管理父過程不再運行的情況。 請注意,
struct對於與本機<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>
>
以上是如何使用託管代碼可靠地獲取.NET中的父進程ID?的詳細內容。更多資訊請關注PHP中文網其他相關文章!