【问题标题】:Is it possible to "talk" with running process?是否可以与正在运行的进程“交谈”?
【发布时间】:2012-05-10 13:47:16
【问题描述】:

我想创建一些将作为简单进程运行的服务,并为其他应用程序提供向他发送 xml 流的可能性。

我的意思是创建带有无限循环的简单进程 (exe) - 并且任何应用程序都可以将 XML(文件/流)发送到该进程 => 并且该进程会将 xml 发送到某个套接字。

没有管道可以做到吗? 我想做一些类似 COM 的事情——它可以“捕获”工作进程的实例。

【问题讨论】:

    标签: c# .net xml sockets


    【解决方案1】:

    是的,当然你可以使用 TCP socket 连接。如果你想避免网络连接,就像评论中所提到的那样,你可以使用共享内存方法,例如 Memory-Mapped Files

    【讨论】:

      【解决方案2】:

      当然。

      您可以在 c# 中使用命名管道类:

      服务器:

      using (var s = new NamedPipeServerStream ("myPipe"))
      {
       s.WaitForConnection();
       s.WriteByte (100);
       Console.WriteLine (s.ReadByte());
      }
      

      客户端代码:

      using (var s = new NamedPipeClientStream ("myPipe"))
      {
       s.Connect();
       Console.WriteLine (s.ReadByte());
       s.WriteByte (200);  
      }
      

      编辑

      你可以通过文件来完成。 + systemfileWatcher 类

      将文件放入文件夹中。

      其他进程将审核此文件夹。

      现在您可以传输信息了。

      编辑2

      你可以使用 memoryMappedFile

      并在每个进程中打开一个视图以查看相同的内存区域 - 并传输数据。 我认为它是最好的。

      流程A:

       static void Main(string[] args)
              {
                  using (MemoryMappedFile mmf = MemoryMappedFile.CreateNew("testmap", 4000))
                  {
                      bool mutexCreated;
                      Mutex mutex = new Mutex(true, "testmapmutex", out mutexCreated);
                      using (MemoryMappedViewStream stream = mmf.CreateViewStream())
                      {
                          BinaryWriter writer = new BinaryWriter(stream);
                          string st = "Hellow";
                          int stringSize = Encoding.UTF8.GetByteCount(st); //6
                          writer.Write(st);
                          writer.Write(123); //6+4 bytes = 10 bytes
                      }
                      mutex.ReleaseMutex();
                      Console.WriteLine("Start Process B and press ENTER to continue.");
                      Console.ReadLine();
                      mutex.WaitOne();
                      using (MemoryMappedViewStream stream = mmf.CreateViewStream())
                      {
                          BinaryReader reader = new BinaryReader(stream);
                          Console.WriteLine("Process  A  says: {0}", reader.ReadString());
                          Console.WriteLine("Process  A says: {0}", reader.ReadInt32());
                          Console.WriteLine("Process  B says: {0}", reader.ReadInt32());
                      }
                      mutex.ReleaseMutex();
                  }
              }
      

      进程 B 写入其区域

       static void Main(string[] args)
              {
                  try
                  {
                      using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("testmap"))
                      {
                          Mutex mutex = Mutex.OpenExisting("testmapmutex");
                          mutex.WaitOne();
                          using (MemoryMappedViewStream stream = mmf.CreateViewStream(11, 0)) // From the 11 byte....
                          {
                              BinaryWriter writer = new BinaryWriter(stream, Encoding.UTF8);
                              writer.Write(2);
                          }
                          mutex.ReleaseMutex();
                      }
                  }
                  catch (FileNotFoundException)
                  {
                      Console.WriteLine("Memory-mapped file does not exist. Run Process A first.");
                  }
              }
      

      【讨论】:

      • 但我的问题是,如果没有管道可以做到这一点!
      • 我想做一些类似 COM 的事情——它可以“捕获”工作进程的实例。
      • @Yanshof 我不认为你可以在没有套接字/管道的情况下与另一个进程交互......
      • 我知道 .. 但也许还有其他一些我/我们不知道的方式 :)
      • 好主意共享内存! StackOverflow 很奇怪... :)
      【解决方案3】:

      只需使用 C# 套接字侦听来自其他进程的连接并编写自定义 XML 文件接收器。

      【讨论】:

      • 但我也不想使用网络..它都在同一台机器上运行
      • 如果你想避免网络连接,你可以尝试使用共享内存。
      • 无论如何我都会使用套接字。只需将其发送到本地主机。我自己经常这样做,网络或没有网络。
      【解决方案4】:

      您正在寻找的是某种形式的 IPC(进程间通信)。有很多可能性:

      1. 常规文件。 Windows 专门为临时文件提供位置 (%TEMP%)
      2. 对于小数据,您可以使用注册表,尽管在大多数情况下它不适合使用
      3. 内存映射文件,与文件类似,但在内存中
      4. 正如 Royi 正确提到的,如果您决定尝试管道,NamedPipeStream 是一种方法
      5. 您可以创建一个 WCF 端点。听起来很拖沓,但 Visual Studio 会为你创建所有的脚手架,所以最终不是这样的问题
      6. 如果您正在开发表单应用程序,则可以使用窗口消息,有时即使不是
      7. 您提到数据是 XML,所以这种方法不适合您,但我还是要提一下:您可以使用命名的内核对象,例如:互斥体、事件、信号量将信号从一个程序传递到另一个程序.

      【讨论】:

      • 另外:使其中一个进程成为进程外 COM 服务器并调用方法并附加到其 COM 接口上的事件。这允许进程之间的双向通信。
      猜你喜欢
      • 2010-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-22
      相关资源
      最近更新 更多