3

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

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

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

4

4 回答 4

5

当然。

您可以在 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.");
            }
        }
于 2012-04-30T21:30:55.390 回答
4

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

于 2012-04-30T21:31:04.227 回答
3

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

于 2012-04-30T21:30:41.793 回答
2

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

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