向 运行 System.Diagnostics.Process 发送信号以开始关闭程序

Signal a Running System.Diagnostics.Process to Begin Shut-Down Procedure

我有一个给定控制台应用程序的多个实例 运行 一次,我想向特定 运行 控制台发送信号以停止处理,以便我可以优雅地关闭它。我看到的大多数选项都是终止进程,而不是发出信号。

  1. 我已经有了成功终止进程的代码。
  2. 我想在关闭进程之前优雅地向进程发出停止处理记录的信号
  3. 进程可能在当前机器上或在另一台机器上

我一直在研究各种选择,但有点困惑。所以我不会列出我研究过的选项。

所以我的问题是...

问:在同一台机器上向进程发送信号的最佳选择是什么?
问:在另一台机器上向进程发送信号的最佳选择是什么?

好的,所以每个人都想知道的是这个。

应用程序未设计为受外部应用程序干扰。 这是应用程序 space。如果不使用某种 public API.

,应用程序 A 不应该能够干扰应用程序 B 的内部工作。

如果你真的希望它能够这样做,你需要进入 DLL 注入的领域,这是非常 hacky 且不容易实现的。

如果您可以控制这两个应用程序的代码,我建议您

  1. 使您希望关闭 COM 的应用程序可见。 (然后您应该能够使用脚本或代码从外部应用程序将其关闭)

  1. 使用 TCPListener class 在您希望关闭的应用程序上打开一个端口。 等待收到关机消息,然后触发您的内部关机命令。做一个 Application.Quit();实际上可以与 Process.Kill 相同 - 所以如果您有一些非常重要的业务逻辑需要完成,您需要将 Application.Quit() 包装在您自己的关闭逻辑方法中。

会是这样的:

应用 1 - 启动

App 1 - 在端口 12345 上启动 TCPListener 应用程序 1 - 开始执行业务逻辑

App 2 - 在端口 12345 上连接到 App1 应用程序 2 - 发送关机命令

App 1 - 检测关机命令并设置一个内部变量来表示“不应启动更多工作

App 1 - 完成其最后一个工作项,然后检测到变量仍设置为 'No more work',因此它关闭,完成了其当前工作项。

只有当您可以控制两个应用程序的代码,或者您非常熟练使用 DLL 注入和内部方法挂钩时,才能做到这一点。 我过去曾这样做过,我将一个 dll 注入到父应用程序中,以创建 TCPListener。但是,在当前工作项目完成之前将其设置为 'wait',同时阻止新项目启动 - 将是主要的复杂问题。