Das Erhalten des übergeordneten Prozesses in .NET ist eine gemeinsame Aufgabe, die mit Plattformaufrufen (P/Invoke) implementiert werden kann. In diesem Artikel wird jedoch eine Alternative eingeführt, die P/Invoke nicht verwenden muss.
Diese Lösung verwendet die NTQueryInformationProcess -Funktion in der Bibliothek von Ntdll.dll, interagiert jedoch nicht direkt über P/Invoke, sondern verwendet die Klasse der Elternprozessilities, um den Prozess abstrahieren.
ParentProcessutilities -Klassen enthalten statische Methoden wie GetParentProcess, die eine Instanz der Procestess -Klasse akzeptiert, die die Prozesse des übergeordneten Prozesses angibt.
[StructLayout(LayoutKind.Sequential)] public struct ParentProcessUtilities { // 这些成员必须与PROCESS_BASIC_INFORMATION匹配 internal IntPtr Reserved1; internal IntPtr PebBaseAddress; internal IntPtr Reserved2_0; internal IntPtr Reserved2_1; internal IntPtr UniqueProcessId; internal IntPtr InheritedFromUniqueProcessId; }
ntQueryInformationProcess -Funktion zum Abrufen der grundlegenden Informationen des angegebenen Prozesses, einschließlich der Vererbungsprozess -ID. Durch Abfragen dieser Informationen und der Konvertierung in eine Prozessinstanz können diese Lösung den übergeordneten Vorgang im Hosting -Code ohne Verwendung von P/Invoke problemlos abrufen.
public static Process GetParentProcess(IntPtr handle) { ParentProcessUtilities pbi = new ParentProcessUtilities(); 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; } }
Das obige ist der detaillierte Inhalt vonWie bekomme ich den übergeordneten Prozess in .NET, ohne P/Invoke zu verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!