是否有可能与正在运行的流程"交谈"?

Yan*_*hof 3 .net c# xml sockets

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

我的意思是使用无限循环创建简单的进程(exe) - 并且任何应用程序都能够将XML(文件/流)发送到此进程=>并且此进程将xml发送到某个套接字.

没有管道可以做到吗?我想做一些类似COM的事情 - 可以"捕捉"工作流程的实例.

Roy*_*mir 5

当然.

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

服务器:

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

客户代码:

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

编辑

你可以通过文件来做.+ systemfileWatcher类

将文件放在一个文件夹中.

另一个进程将审核此文件夹.

现在你可以转移信息了.

EDIT2

你可以使用memoryMappedFile

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

流程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();
            }
        }
Run Code Online (Sandbox Code Playgroud)

进程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.");
            }
        }
Run Code Online (Sandbox Code Playgroud)