Откройте форму F2 из формы F1, затем удалите форму F1 - PullRequest
0 голосов
/ 08 января 2020

Я знаю, что этот вопрос задавался несколько раз, когда форма A запускает другую форму B, а затем A необходимо закрыть, а B продолжить работу. Но у меня проблема в том, что A не только закрыт, но и удален, так как включается также установщик.

Процесс:

Установщик устанавливает как A, так и B, A - это Основная форма. Когда A запускается, он проверяет, есть ли новая версия. Если это так, A нужно запустить форму B отдельно , чтобы B мог вызвать скрипт .bat, который удалит A, и заменить его с сервера последней версией. (B - простая форма с 1 меткой - Обновление, пожалуйста, подождите). Проблема в том, что при вызове B он вызывает файл .bat, который переходит к деинсталляции. Это означает, что он также убивает A, а A также убивает B. Поэтому, когда происходит деинсталляция, пожалуйста, подождите, форма исчезла, и процесс остановился.

То, что я пробовал до сих пор, это попытка запустить B в Program.cs A в новом потоке, чтобы он был "независимым" от A, но безуспешно

var t = new System.Threading.Thread(ThreadProc);
t.Start();
Close();

public static void ThreadProc()
{
    Application.Run(new B());
}

I также пытался вызвать B без потока, но как только A удаляется, B тоже умирает.

Application.Run(new B());
or
var b = new B();

Если я вручную запускаю форму B (обновление) из папки, он удаляет A и устанавливает последний. Есть ли способ достичь этого изнутри формы A, чтобы он вызывал B независимо, что затем может завершить sh процесс?

1 Ответ

1 голос
/ 08 января 2020

Если под формами вы имеете в виду исполняемые файлы ... тогда вам просто нужно убить процесс.

using System.Diagnostics;

Process bProcesss = Process.Start("C:\B.exe");
// do something
bProcess.Kill();

В вашем случае вам может понадобиться что-то подобное для вызова из B.exe

Static void Main()
{
    KillProcess("A_Program");
}
private static void KillProcess(string processName)
{
    Process[] runningProcesses = Process.GetProcesses();
    foreach (Process process in runningProcesses)
    {
        if (process.ProcessName == processName)
        {
            process.Kill();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...