Heim > Backend-Entwicklung > C++ > Wie kann ich mit dem Managed Code zuverlässig eine übergeordnete Prozess -ID in .NET zuverlässig erhalten?

Wie kann ich mit dem Managed Code zuverlässig eine übergeordnete Prozess -ID in .NET zuverlässig erhalten?

Barbara Streisand
Freigeben: 2025-01-28 05:31:15
Original
633 Leute haben es durchsucht

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

Abrufen der übergeordneten Prozess -ID in .NET: Eine robuste Lösung

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage