首页 > 后端开发 > C++ > 如何使用托管代码可靠地获取.NET中的父进程ID?

如何使用托管代码可靠地获取.NET中的父进程ID?

Barbara Streisand
发布: 2025-01-28 05:31:15
原创
633 人浏览过

How to Reliably Get a Parent Process ID in .NET Using Managed Code?

>检索.NET中的父进程ID:一个可靠的解决方案

挑战:

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板