Как убить один субпроект WPF полностью в одном решении? [Дубликат]

По умолчанию исходная папка JNI называется jni. Переименование его в cpp исправило проблему

33
задан Cœur 4 April 2017 в 14:52
поделиться

9 ответов

Это очень сработало для меня:

/// <summary>
/// Kill a process, and all of its children, grandchildren, etc.
/// </summary>
/// <param name="pid">Process ID.</param>
private static void KillProcessAndChildren(int pid)
{
    // Cannot close 'system idle process'.
    if (pid == 0)
    {
        return;
    }
    ManagementObjectSearcher searcher = new ManagementObjectSearcher
            ("Select * From Win32_Process Where ParentProcessID=" + pid);
    ManagementObjectCollection moc = searcher.Get();
    foreach (ManagementObject mo in moc)
    {
        KillProcessAndChildren(Convert.ToInt32(mo["ProcessID"]));
    }
    try
    {
        Process proc = Process.GetProcessById(pid);
        proc.Kill();
    }
    catch (ArgumentException)
    {
        // Process already exited.
    }
}

Обновление 2016-04-26

Протестировано на Visual Studio 2015 Update 2 в Win7 x64.

Обновление 2017-11-14

Добавлена ​​проверка процесса простоя системы if (pid == 0)

Обновление 2018 -03-02

Нужно добавить ссылку на пространство имен System.Management, см. Комментарий от @MinimalTech ниже. Если у вас установлен ReSharper, он предложит вам сделать это автоматически.

49
ответ дан JHobern 17 August 2018 в 09:16
поделиться
  • 1
    Что насчет внуков? Понятно, что это должен быть рекурсивный метод. – kerem 17 July 2013 в 15:31
  • 2
    @kerem erm Я думаю, что это – Dave Lawrence 21 February 2014 в 13:01
  • 3
    @daveL - расплавление головного мозга – kerem 21 February 2014 в 14:49
  • 4
    Что делать, если E_ACCESSDENIED при перечислении процессов? – Mygod 17 January 2017 в 17:21
  • 5
    Ты замечательный!! Работает как шарм с .NET 4.0 и VS2010. Чтобы отметить кого-то (например, я), который не знал, вам нужно использовать пространство имен System.Management. Но чтобы иметь возможность использовать его, вы должны перейти к своему имени проекта - & gt; rightclick к нему - & gt; добавить ссылку - & gt; .NET - & gt; и выберите сборку System.Management, как @Femaref, обратите внимание на это: stackoverflow.com/questions/3692384/… – MinimalTech 1 March 2018 в 22:56

Если кому-то понадобится ядро ​​dotnet, dotnet cli разработал реализацию на основе taskill, как упоминалось выше, и рекурсивный pgrep / kill для систем на основе unix. Полная реализация может быть найдена на github . К сожалению, класс является внутренним, поэтому вам придется скопировать его в свою базу кода.

Список дочерних процессов (необходимо выполнить рекурсивно):

$"pgrep -P {parentId}"

Убить по процессу :

$"kill -TERM {processId}"
4
ответ дан Ben Gribaudo 17 August 2018 в 09:16
поделиться

Как правильно закрыть Internet Explorer при запуске из PowerShell?

Некоторые из тех, кто прокомментировал этот поток, вызвали ошибку в Win7 (так как это не похоже, для пользователей, которые используют другие версии окон). Многие страницы в Интернете, в том числе ошибки пользователя на странице Microsoft, указывают, что вы просто используете доступный метод quit для IE-объекта, который SUPPOSED также закрывает все дочерние процессы (и, как сообщается, это делает в Win8 / XP и т. Д.)

Должен признать, со своей стороны, это ошибка пользователя WAS. Я нахожусь в win7, и причина, по которой метод quit не работал для меня, был из-за ошибки в кодировании. А именно, я создавал объект IE при объявлении, а затем создавал другой (прикрепленный к тому же объекту) позже в коде ... Я почти закончил взломать процедуру убийства родительского ребенка, чтобы работать на меня, когда я понял проблему.

Из-за того, как IE функционирует, идентификатор processID, который вы породили, поскольку родительский объект может быть прикреплен к другим окнам / подпроцессам, которые вы НЕ создали. Используйте quit и помните, что в зависимости от пользовательских настроек (например, пустой кеш при выходе) для завершения процессов и закрытия их может потребоваться несколько минут.

4
ответ дан Community 17 August 2018 в 09:16
поделиться
  • 1
    Да, это отвечает как на то, почему начинаются 2 процесса, так и как убивать дерево процессов. Как-то я не мог найти это раньше, спасибо. – robr 5 May 2011 в 18:31
  • 2
    Хотя, я должен признать, я ожидал, что это будет намного проще. Barf. – robr 5 May 2011 в 18:33
  • 3
    @robr: Если код работает, он должен быть простой копией и удаляться от успеха. – Matthew Ferreira 5 May 2011 в 18:34

Другое решение - использовать команду taskill. Я использую следующий код в своих приложениях:

public static void Kill()
{
    try
    {
            ProcessStartInfo processStartInfo = new ProcessStartInfo("taskkill", "/F /T /IM your_parent_process_to_kill.exe")
            {
                WindowStyle = ProcessWindowStyle.Hidden,
                CreateNoWindow = true,
                UseShellExecute = false,
                WorkingDirectory = System.AppDomain.CurrentDomain.BaseDirectory,
                RedirectStandardOutput = true,
                RedirectStandardError = true
            };
            Process.Start(processStartInfo);
    }
    catch { }
}
6
ответ дан Juan Carlos Velez 17 August 2018 в 09:16
поделиться

Я не поклонник каких-либо решений, представленных здесь.

Вот что я придумал:

private static void EndProcessTree(string imageName)
{
    Process.Start(new ProcessStartInfo
    {
        FileName = "taskkill",
        Arguments = $"/im {imageName} /f /t",
        CreateNoWindow = true,
        UseShellExecute = false
    }).WaitForExit();
}

Как использовать:

EndProcessTree("chrome.exe");
8
ответ дан Owen 17 August 2018 в 09:16
поделиться

Вы должны вызвать Process.CloseMainWindow(), который отправит сообщение в главное окно процесса. Подумайте об этом как о том, чтобы пользователь нажал кнопку закрытия «X» или File | Выйти из пункта .

Безопаснее отправлять сообщение в Internet Explorer, чтобы закрыть его, а не идти и убивать все его процессы. Эти процессы могут что-то делать, и вы должны позволить IE сделать свое дело и закончить, прежде чем просто убить его в середине того, что может быть важным для будущих прогонов. Это верно для любой программы, которую вы убиваете.

10
ответ дан Pierre Arnaud 17 August 2018 в 09:16
поделиться
  • 1
    Я думаю, что это предпочтительный способ ... для процессов с пользовательскими интерфейсами. – robr 3 December 2012 в 22:35

Если кто-то заинтересован, я взял один из ответов с другой страницы и немного изменил его. Теперь это самостоятельный класс со статическими методами. Он не имеет правильную обработку ошибок или протоколирование. Модифицируйте, чтобы использовать для своих нужд. Предоставление вашего корневого процесса KillProcessTree сделает это.

class ProcessUtilities
{
    public static void KillProcessTree(Process root)
    {
        if (root != null)
        {
            var list = new List<Process>();
            GetProcessAndChildren(Process.GetProcesses(), root, list, 1);

            foreach (Process p in list)
            {
                try
                {
                    p.Kill();
                }
                catch (Exception ex)
                {
                    //Log error?
                }
            }
        }
    }

    private static int GetParentProcessId(Process p)
    {
        int parentId = 0;
        try
        {
            ManagementObject mo = new ManagementObject("win32_process.handle='" + p.Id + "'");
            mo.Get();
            parentId = Convert.ToInt32(mo["ParentProcessId"]);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
            parentId = 0;
        }
        return parentId;
    }

    private static void GetProcessAndChildren(Process[] plist, Process parent, List<Process> output, int indent)
    {
        foreach (Process p in plist)
        {
            if (GetParentProcessId(p) == parent.Id)
            {
                GetProcessAndChildren(plist, p, output, indent + 1);
            }
        }
        output.Add(parent);
    }
}
7
ответ дан robr 17 August 2018 в 09:16
поделиться
4
ответ дан Community 6 September 2018 в 06:56
поделиться
4
ответ дан Community 29 October 2018 в 13:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: