我可以在现有stream程上执行代码吗?

我有一个应用程序运行,并不断在系统托盘图标。 它通过运行一些使用@Global互斥体的代码来确保它是我的应用程序的唯一运行实例。

由于第三方供应商的限制,我可以与供应商应用程序的一部分集成的唯一(理智的)方式是通过在configuration文件中指定任意命令行可执行文件被调用。 我关心的参数会自动添加到我指定的可执行文件中。

所以我认为大多数与此集成的人运行一个独立的程序,它连接到主程序的服务器套接字并发送一个让主程序知道命令行被触发的包。

我想知道是否有办法我可以做这个伪代码..

static void Main(string[] args) { if (isrunningcommandLine) { ConnectToAlreadyRunningProcessAndPassInfo(args); // find already running process by its process name and somehow pass the command line params KillProgram(); } else { CheckGlobalMutexAndStart(); } } 

本质上,如果我通过命令行运行连接到已经运行的全局进程并传递一些数据。

我控制的代码将是客户端以及服务器,他们实际上是同一个项目。

您可以使用全局命名互斥来检测您的应用是否已经在运行。

  • 如果没有运行将接收和管理命令的服务器。
  • 如果运行一个客户端,只发送命令到服务器。

然后在本地主机上使用TCP连接来交换消息。

  using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; namespace Test42 { internal static class Program { private static int PORT = 1337; private static void Main() { bool ok; // Try to build a mutex. var mutex = new Mutex(true, @"Test42", out ok); // If build is ok, we run as a server. // Otherwise, the server is already running, so we run as a client. if (ok) { var server = new Myserver(PORT); server.Start(); } else { var r = new Random(); var message = "Ho Hey : " + r.Next(50); var client = new MyClient(); client.Send(PORT, message); } } } internal class MyClient { /// <summary> /// Send a message to localhost. /// </summary> /// <param name="port">The port to connect.</param> /// <param name="message">The message to send.</param> public void Send(int port, string message) { var client = new TcpClient(); var serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), port); client.Connect(serverEndPoint); using (var stream = client.GetStream()) { var messageBuffer = Encoding.Unicode.GetBytes(message); var lengthBuffer = BitConverter.GetBytes(messageBuffer.Length); // Send message length. stream.Write(lengthBuffer, 0, lengthBuffer.Length); // Send message. stream.Write(messageBuffer, 0, messageBuffer.Length); stream.Flush(); } client.Close(); } } internal class Myserver { private readonly int _port; public Myserver(int port) { _port = port; } public void Start() { Console.WriteLine("wait for messages"); var thread = new Thread(ThreadStart); thread.Start(); } private void ThreadStart() { var listener = new Tcplistner(IPAddress.Any, _port); listener.Start(); while (true) { var client = listener.AcceptTcpClient(); var clientThread = new Thread(ClientThreadStart); clientThread.Start(client); } } private void ClientThreadStart(object obj) { var client = obj as TcpClient; if (client == null) return; using (var stream = client.GetStream()) { const int lengthLength = sizeof(int) / sizeof(byte); // Read the message length. var lengthBuffer = new byte[lengthLength]; stream.ReadAsync(lengthBuffer, 0, lengthLength).Wait(); var messageLength = BitConverter.ToInt32(lengthBuffer, 0); // Read the message. var messageBuffer = new byte[messageLength]; stream.ReadAsync(messageBuffer, 0, messageLength).Wait(); var message = Encoding.Unicode.GetString(messageBuffer); Console.WriteLine("Client says: " + message); } client.Close(); } } }