【问题标题】:C# program parameters from the command line?来自命令行的 C# 程序参数?
【发布时间】:2011-04-21 03:03:18
【问题描述】:

我正在尝试启动一个正在运行的 C# 程序,然后在它开始运行后从 cmd.exe 向它发出命令。例如,假设我从命令行 (C://FILEPATH/my_program.exe) 启动了我的 .exe。然后我想让该程序继续运行,然后让我能够向它传递它能够处理的命令。在我的理想世界中,这将类似于“C://FILEPATH/my_program.exe run_my_command()”,它将执行 run_my_command 函数,或者“C://FILEPATH/my_program.exe k”,它将做一些响应到我预先编程的字符 k。我知道,正如我键入的那样,将启动 my_program.exe 的新副本。我只想在我通过类似的东西时让一个跑步。

有人知道怎么做吗?示例代码将不胜感激。谢谢!!

【问题讨论】:

  • 您为什么不希望它作为 GUI 应用程序(因为您希望它是交互式的)或传统的客户端-服务器应用程序(连接到服务器、发送命令、断开连接)?跨度>
  • 我正在启用网络功能。我正在使用 PHP 中的 System() 写入命令行。

标签: c# stdin cmd


【解决方案1】:

最简单的解决方案是让您的第二个“my_program.exe”实例查找已经在运行的现有实例,将消息“传递”给它,然后立即退出。

通常的实现方式是通过命名管道(.NET 3.5+ 中的System.IO.Pipes)。当您的程序启动时,在具有给定名称的命名管道上进行侦听。如果该管道上已经有其他东西在侦听,请将消息发送给它并退出。

【讨论】:

  • +1,但我建议使用远程处理或 WCF 而不是命名管道作为进程间通信方法。
  • @Kragen:为什么?压倒imo
  • @abatishchev - 命名管道是一种低级机制 - 您有责任定义协议、处理错误以及解决任何安全问题。 .Net remoting / WCF 是命名管道(和其他传输机制)的包装器,提供上述所有功能以及更多功能 - 如果已经存在命名管道,为什么还要努力编写自己的基于命名管道的 IPC 机制?
  • WCF 可以通过 NetNamedPipesBinding 简化命名管道的处理,所以我推荐使用它。
【解决方案2】:

您正在描述一个典型的服务和命令工具。服务(恶魔)在后台运行并执行命令。命令工具接受用户命令并将它们传递给服务。见Windows Service Applications。使用服务而不是启动多个进程可以解决您的方法存在的一些问题,例如进程之间的安全隔离(例如,一个用户启动 a 命令,另一个用户启动另一个命令并在第一个用户的上下文中执行)和进程生命周期问题(用户启动命令然后关闭他的会话)。

命令工具将通过经典 IPC(本地 RPC、管道、共享内存等)与进程通信。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-22
    • 2016-10-26
    • 2018-10-05
    • 2020-08-09
    • 2015-12-08
    相关资源
    最近更新 更多