如何让Process.Start启动独立的控制台应用进程?
在C#中实现双击.exe文件的效果启动独立控制台进程
你遇到的问题核心原因是:从控制台应用直接调用Process.Start()时,子控制台进程会默认继承父进程的控制台窗口,导致所有输出合并显示,看起来进程未独立;而双击exe是由资源管理器(非控制台进程)启动,系统会自动为每个子进程创建全新的控制台窗口。
要实现和双击完全一致的效果,只需通过ProcessStartInfo配置启动参数,让系统以shell方式启动进程,具体方案如下:
- 设置
UseShellExecute = true:这会让系统调用shell启动进程,和双击exe的底层逻辑一致,自动为每个子进程创建独立控制台窗口。 - 显式指定
WorkingDirectory:确保子进程在正确的输出目录运行,避免因父进程工作目录不符导致找不到依赖文件。
修改后的代码示例:
using System.Diagnostics; using System.Reflection; using System.IO; // ... Console.WriteLine("Starting Chat server"); var chatStartInfo = new ProcessStartInfo("ChatServer.exe") { UseShellExecute = true, WorkingDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) }; Process.Start(chatStartInfo); Console.WriteLine("Starting Map server"); var mapStartInfo = new ProcessStartInfo("MapServer.exe") { UseShellExecute = true, WorkingDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) }; Process.Start(mapStartInfo); Console.WriteLine("Starting Mission server"); var missionStartInfo = new ProcessStartInfo("MissionServer.exe") { UseShellExecute = true, WorkingDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) }; Process.Start(missionStartInfo); Console.WriteLine("Starting Queue server"); var queueStartInfo = new ProcessStartInfo("QueueServer.exe") { UseShellExecute = true, WorkingDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) }; Process.Start(queueStartInfo); while(true) {}
补充说明:
UseShellExecute = true是默认值,但显式设置可以避免其他配置覆盖导致的异常。- 不要设置
CreateNoWindow = true,否则会阻止新控制台窗口的创建。 - 每个启动的进程会拥有独立的内存空间和执行上下文,完全满足你对独立进程的需求,无需切换到批处理或PowerShell。
内容的提问来源于stack exchange,提问作者Alexander Ryan Baggett
相关产品推荐
相关产品推荐

