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

实现Myservices.exe启动时打开Demo.exe、停止时关闭该程序

在Windows服务中控制外部EXE的启动与停止

没问题,我来给你捋捋怎么实现这个需求——在Windows服务里启动和停止Demo.exe。核心思路就是用System.Diagnostics.Process类管理外部进程,在服务启动时拉起程序并保存进程实例,停止时通过这个实例精准关闭它。

步骤1:准备进程变量

先在你的服务类里声明一个私有Process对象,用来存Demo.exe的进程实例,这样后续停止服务时能直接操作这个进程:

private Process _demoProcess;

步骤2:在服务启动事件(OnStart)中启动Demo.exe

重写服务的OnStart方法,在这里启动Demo.exe。注意要指定正确的文件路径,最好用绝对路径或者结合程序目录来定位,避免找不到文件:

protected override void OnStart(string[] args)
{
    try
    {
        // 这里替换成你的Demo.exe实际路径,比如用程序所在目录拼接
        string demoExePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Demo.exe");
        
        ProcessStartInfo startInfo = new ProcessStartInfo
        {
            FileName = demoExePath,
            WorkingDirectory = Path.GetDirectoryName(demoExePath),
            UseShellExecute = false, // 服务环境下建议设为false
            CreateNoWindow = false // 如果Demo.exe有UI,按需调整是否隐藏窗口
        };

        _demoProcess = Process.Start(startInfo);
        // 可选:写入Windows事件日志,记录启动成功信息
        EventLog.WriteEntry("MyServices", "Demo.exe已成功启动", EventLogEntryType.Information);
    }
    catch (Exception ex)
    {
        // 捕获异常并写入日志,方便排查问题
        EventLog.WriteEntry("MyServices", $"启动Demo.exe失败: {ex.Message}", EventLogEntryType.Error);
    }
}

步骤3:在服务停止事件(OnStop)中关闭Demo.exe

重写OnStop方法,优先尝试优雅关闭进程(调用CloseMainWindow),如果不行再强制终止,同时记得释放资源:

protected override void OnStop()
{
    try
    {
        if (_demoProcess != null && !_demoProcess.HasExited)
        {
            // 先尝试优雅关闭,适合有UI的程序
            if (_demoProcess.CloseMainWindow())
            {
                // 等待5秒让进程退出,超时则强制终止
                if (!_demoProcess.WaitForExit(5000))
                {
                    _demoProcess.Kill();
                }
            }
            else
            {
                // 无法优雅关闭时强制终止进程
                _demoProcess.Kill();
            }
            // 释放进程资源
            _demoProcess.Dispose();
            _demoProcess = null;
            EventLog.WriteEntry("MyServices", "Demo.exe已成功停止", EventLogEntryType.Information);
        }
    }
    catch (Exception ex)
    {
        EventLog.WriteEntry("MyServices", $"停止Demo.exe失败: {ex.Message}", EventLogEntryType.Error);
    }
}

几个关键注意事项

  • 权限问题:确保Windows服务运行的账户(默认是Local System)有足够权限启动Demo.exe,如果程序需要访问特定资源,可能需要切换服务的登录账户。
  • UI程序可见性:Windows服务默认运行在会话0,如果你需要Demo.exe的UI能被当前用户看到,需要额外处理会话切换(这会增加复杂度,后台程序一般不需要)。
  • 路径准确性:尽量用绝对路径定位Demo.exe,避免因服务工作目录和预期不同导致找不到文件。

内容的提问来源于stack exchange,提问作者krunal modi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:53:33