You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 04:06:03