Wie man parent-Prozess .NET in der verwalteten Weg
Ich suchte eine Menge für die Methode zu bekommen übergeordneten Prozess .NET, fand aber nur ein P/Invoke Weg.
Was passiert, wenn mehrere Instanzen des Prozesses ausgeführt werden, da Sie haben alle die gleiche "ProcessName"?
Falls es jemandem hilft: ich persönlich brauchte nur die parent-Prozess-ID. Die folgenden Lösungen, die von Michael Hale und Simon Mourier nicht funktionieren, wenn der übergeordnete Prozess beendet wurde, weil Sie den Aufruf
Siehe auch stackoverflow.com/questions/2531837/...
Wie über Sie senden die Parent-Prozess-id als Kommandozeilen-argument? 🙂
Falls es jemandem hilft: ich persönlich brauchte nur die parent-Prozess-ID. Die folgenden Lösungen, die von Michael Hale und Simon Mourier nicht funktionieren, wenn der übergeordnete Prozess beendet wurde, weil Sie den Aufruf
Process.GetProcessById()
mit einer ID von einer (jetzt) nicht vorhandene process-ID. Aber an diesem Punkt haben Sie die parent-Prozess-ID, so können Sie verwenden, wenn Sie es brauchen, wie ich.Siehe auch stackoverflow.com/questions/2531837/...
Wie über Sie senden die Parent-Prozess-id als Kommandozeilen-argument? 🙂
InformationsquelleAutor abatishchev | 2008-12-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieser code stellt eine schöne Schnittstelle für die Suche nach dem Parent-Prozess-Objekt und berücksichtigt die Möglichkeit, mehrere Prozesse mit dem gleichen Namen:
Verwendung:
Code:
float.As
definiert?Das sind einige erstaunlich schlecht benannten Methoden.
In meinen Tests, das ist viel langsamer als Simon Mourier Lösung. Auch ist es leider noch eine Art "bring-Prozess vor" - Mechanismus. Ich bin mir nicht sicher, warum. Hat sonst noch jemand erlebt? Den test bin ich mit für das ist ein setup bootstrapper EXE-Datei von Visual Studio erstellt, startet der MSIEXEC.exe windows-installer.
Leider funktioniert es nicht, wenn der Leistungsindikator Kategorie-Namen lokalisiert ist (z.B. auf nicht-englischen Windows).
Ich würde vorschlagen, Simon ' s version, es sei denn, es gibt einen dringenden Grund nicht, weil der performance-Unterschied ist signifikant.
InformationsquelleAutor Michael Hale
Hier ist eine Lösung. Es nutzt p/invoke, aber scheint gut zu funktionieren, 32 oder 64 cpu:
Super!!! Keine langsame perf Counter. Ich hasse das "nicht geschafft" Kommentare. Wie ist das Abfragen einer perf counter mehr "verwaltet", die mithilfe von P/Invoke.
Leider ist diese Funktion nur intern. MSDN sagt, dass dies "[NtQueryInformationProcess kann verändert werden, oder nicht in zukünftigen Versionen von Windows. Anwendungen sollten die alternativen Funktionen aufgeführt, die in diesem Thema.]" msdn.microsoft.com/en-us/library/windows/desktop/...
Es ist dort seit fast 20 Jahren, so bezweifle ich, wird es entfernt morgen, und es gibt keine alternativ-NT-Funktionen, gibt die parent-Prozess-nach meinem wissen-aber ja, sicher, Nutzung auf eigene Gefahr.
Ich hatte ein system, das mithilfe von Leistungsindikatoren, um die parent-ID. Leider, wenn die Schleife durch 300+ - Prozesse und die Erstellung von Leistungsindikatoren, nur um die Eltern-ID, die Leistung war schrecklich. Ich würde lieber vermeiden Sie direkte Win32-API-Aufrufe, aber der Unterschied war, wenn Sie einen Dienst beenden in 1 Sekunde im Gegensatz zur Entnahme Minuten mit einem PerformanceCounter-version. Als ein Ergebnis, das auf einem server mit einer Vielzahl von Dienstleistungen, dies ist die Haupt-version, die dürfte geeignet sein, aus performance-Gründen.
InformationsquelleAutor Simon Mourier
Diese Weise:
InformationsquelleAutor Péter Major
Hier mein Versuch bei einer verwalteten Lösung.
Er fragt die Leistungsindikatoren für alle Prozesse und gibt ein Lexikon, Kind-PID an Eltern-PID. Dann können Sie das Wörterbuch mit Ihrem aktuellen PID, um zu sehen, Ihre Eltern, Großeltern, etc.
Ist es übertrieben, wie viel Informationen es bekommt, das ist sicher. Fühlen Sie sich frei, zu optimieren.
In anderen news, ich habe gelernt, wie viele Leistungsindikatoren gab es auf meinem Rechner: 13401. Heilige Kuh.
InformationsquelleAutor Jeremy Murray
Wenn die Annahme P/Invoke, es gibt einen besseren Weg, die mehr dokumentiert als
NtQueryInformationProcess: nämlich PROCESSENTRY32 (CreateToolhelp32Snapshot, Process32First, Process32Next). Es ist in diesem post.
Achten Sie auf die die subtilen details
und beachten Sie, dass die parent-PID wird nicht unbedingt der Schöpfer PID, in der Tat, diese möglicherweise nicht vollständig, wie bereits von der community-Kommentaren an
PROCESSENTRY32.
InformationsquelleAutor robert4
Wenn Sie jemals gegraben des BCL, so werdet Ihr finden, dass die Wege zu finden, übergeordneten Prozess bewusst vermieden, nehmen Sie dies zum Beispiel:
https://referencesource.microsoft.com/#System/services/monitoring/system/diagnosticts/ProcessManager.cs,327
Wie Sie sehen können, in den source-code, es enthält umfassende Strukturen und importiert native Methoden sind absolut ausreichend, um den job zu erledigen. Jedoch, selbst wenn Sie Zugriff per reflection(das ist möglich), würden Sie nicht eine Methode finden, es zu tun direkt. Ich kann nicht beantworten, warum, aber dieses Phänomen bewirkt, dass Fragen wie deine, werden gebeten, sich für etwas wiederholt; zum Beispiel:
Wie bekomme ich die PID des übergeordneten Prozesses, dass meine Bewerbung
Für die gibt es keine Antwort, zusammen mit einigen code mit CreateToolhelp32Snapshot in diesem thread, würde ich es hinzufügen-Teil der Struktur-Definitionen und Namen, die ich stehlen, von der MS " Referenz-Quelle 🙂
Code
Und wir können es verwenden, wie:
Test
Für alternative enden ..
Laut der Dokumentation gibt es ein paar Methoden iteration pro Typ der Eingaben, wie
Process32First
undProcess32Next
sind für die iteration der Prozesse; aber ich fand die `xxxxFirst " Methoden überflüssig sind, und dann dachte ich, warum nicht setzen die iteration-Methode mit dem entsprechenden Eintrag geben? Es wäre leichter zu implementieren und verstanden zu werden(vermute ich mal so ..).Nur als
Toolhelp32
Suffix helfen, ich denke, dass eine statische helper-Klasse die richtige ist, so dass wir die klare qualifizierten Namen wieToolhelp32.Snapshot
oderToolhelp32.IEntry
obwohl es wäre hier irrelevant ..Wenn der parent-Prozess ist gewonnen, wenn Sie weiter wollen, erhalten ausführliche infos, können Sie erweitern mit dieser leicht zu, zum Beispiel, die Iteration über die Module, dann fügen Sie hinzu:
Code - WinModuleEntry
und einige testen ..
In Fall, dass Sie ein code-Beispiel ..
InformationsquelleAutor Ken Kin