如何从另一个不是子进程的进程中启动进程?

时间:2015-04-15 09:14:51

标签: c#

我有一个有趣的场景。我的执行过程是QtAgent32.exe(主要用于自动化测试)。

我有代码来启动测试中的应用程序。如果我在运行此EnsureAppIsRunning()方法之前手动启动应用程序 - 然后它将从以下过程获取应用程序:

_application = ApplicationUnderTest.FromProcess(processes[0]);

现在,在测试运行结束时,QtAgent32.exe将关闭并终止应用程序 - 仅当应用程序是在进程内创建的时候。

再次重申,如果我手动打开了应用程序,那么它会保持活着 - 这就是我想要的行为。

因此,为了尝试解决这个问题,我使用了Process.Start(),并尝试了UseShellExecute - 这没有用。

然后我转到了非托管路线:

STARTUPINFO si = new STARTUPINFO();
            PROCESS_INFORMATION pi = new PROCESS_INFORMATION();
            CreateProcess(Constants.ApplicationUndertestPath, null, IntPtr.Zero, IntPtr.Zero, false, 0, IntPtr.Zero, null, ref si, out pi);

我的问题是,如何从C#启动和应用程序,以便将其视为完全成熟的外部进程(就像它是由我手动启动的)。因此,QtAgent32不会在以后作为子进程终止它。

2 个答案:

答案 0 :(得分:2)

想到的唯一方法是通过使用代理可执行文件,您的应用程序启动代理 - 然后成为您的进程的子进程 - 代理启动所需的应用程序,然后退出。

您可以使用在C#中使用的相同CreateProcess方法 - 我正在使用以下本机代码来实现相同的目标:

CreateProcess(nullptr, pCommandLine.get(), nullptr, nullptr, FALSE, CREATE_SUSPENDED, nullptr, dir.c_str(), &inf, &pinf))

答案 1 :(得分:1)

我使用资源管理器作为代理:

ProcessStartInfo processInfo;

processInfo = new ProcessStartInfo("explorer.exe", Constants.ApplicationUndertestPath);
processInfo.UseShellExecute = false;
processInfo.RedirectStandardError = false;
processInfo.RedirectStandardOutput = false;

Process.Start(processInfo);