我有一个有趣的场景。我的执行过程是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不会在以后作为子进程终止它。
答案 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);