挑战:
找到一种始终可靠的方法以在.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中文网其他相关文章!