C# .Net如何将控制台exe作为Windows服务的子进程启动
解决方案
你当前使用默认Process.Start(path)静态方法启动进程时,默认启用了系统Shell启动模式,子进程会完全独立于父进程运行。要让控制台程序作为服务的子进程启动,只需调整进程启动参数即可,实现方式如下:
完整实现代码
using System.Diagnostics; using System.IO; public partial class YourService : ServiceBase { // 保存子进程实例,用于生命周期管理 private Process _consoleProcess = null; protected override void OnStart(string[] args) { try { string exePath = @"D:\ConsoleTest\bin\Debug\MyConsole.exe"; var startInfo = new ProcessStartInfo(exePath) { // 核心配置:禁用Shell启动,才能绑定父子进程关系 UseShellExecute = false, // 后台运行不弹出控制台窗口 CreateNoWindow = true, // 设置工作目录为控制台程序所在目录,避免相对路径读取异常 WorkingDirectory = Path.GetDirectoryName(exePath) }; _consoleProcess = new Process { StartInfo = startInfo, // 可选:启用进程退出事件监听,可自行实现子进程异常退出后的重启逻辑 EnableRaisingEvents = true }; _consoleProcess.Exited += (sender, e) => { // 可在此处添加日志记录、子进程重启等逻辑 }; _consoleProcess.Start(); } catch (Exception ex) { // 异常建议写入系统事件日志,方便排查启动问题 EventLog.WriteEntry("服务启动失败", $"子进程启动异常:{ex.Message}", EventLogEntryType.Error); throw; } } protected override void OnStop() { // 服务停止时主动销毁子进程,避免残留运行 if (_consoleProcess != null && !_consoleProcess.HasExited) { try { _consoleProcess.Kill(); _consoleProcess.WaitForExit(3000); } catch (Exception ex) { EventLog.WriteEntry("服务停止异常", $"子进程销毁失败:{ex.Message}", EventLogEntryType.Error); } finally { _consoleProcess.Dispose(); _consoleProcess = null; } } } }
关键说明
- 绑定父子进程的核心是将
UseShellExecute设为false,禁用系统Shell的独立启动逻辑,子进程会直接继承服务的运行上下文,形成明确的父子进程关联 - Windows服务运行在会话0隔离环境中,子进程默认也会运行在会话0,不会在用户桌面显示控制台界面,如需调试可重定向
StandardOutput、StandardError流将输出写入日志文件 - 修改代码重启服务后,可打开任务管理器「详细信息」面板,右键列标题勾选「父级 PID」,确认
MyConsole.exe的父级PID和你的服务进程PID一致即可验证配置生效。你当前的进程状态如下:
内容的提问来源于stack exchange,提问作者Yogesh
相关产品推荐
相关产品推荐

