Вопрос по c#, sockets, .net, xml – Можно ли «поговорить» с запущенным процессом?

3

Я хочу создать какой-то сервис, который будет работать как простой процесс и даст другому приложению возможность отправлять ему поток XML.

Я имею в виду создание простого процесса (exe) с бесконечным циклом - и любое приложение сможет отправлять XML (файл / поток) этому процессу = & gt; и этот процесс отправит XML в некоторый сокет.

Возможно ли это сделать без трубы? Я хочу сделать что-то вроде COM - это может "поймать" экземпляр рабочего процесса.

Ваш Ответ

4   ответа
3

Да, конечно, вы можете использовать TCPразъем Соединение. Если вы хотите избежать сетевого подключения, как показано в комментарии, вы можете использовать подход с общей памятью, например, с помощьюОтображенные в память файлы .

4

Просто используйте сокеты C #, которые прослушивают соединения от другого процесса и пишут собственный приемник XML-файла.

Я бы все равно использовал сокеты. Просто отправьте это на localhost. Я делаю это сам много, сеть или нет сети.
но я не хочу использовать сеть также .. все это работает на той же машине Yanshof
Если вы хотите избежать подключения к сети, вы можете попробовать с общей памятью.
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);  
}

edit

Вы можете сделать это по файлу. + systemfileWatcher Class

положить файл в папку.

другой процесс будет проверять эту папку.

и теперь вы можете передавать информацию.

edit2

Вы можете использовать memoryMappedFile

и откройте представление в каждом процессе, чтобы увидеть одну и ту же область Мемри - и передать данные.  Я думаю, что это лучшее.

Process 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();
            }
        }

Process B writes to its region

 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.");
            }
        }
Опрос файла медленный ...
Но мой вопрос: возможно ли это сделать без трубы! Yanshof
Хорошая идея поделилась памятью! StackOverflow странный ... :)
Я хочу сделать что-то вроде COM - это может "поймать" экземпляр рабочего процесса. Yanshof
извиняюсь. не видел. я думаю, что мое решение лучше, чем управление TCP-Cocket ....
2

То, что вы ищете, это какая-то форма IPC (межпроцессное взаимодействие). Существует огромное количество возможностей:

  1. Regular file. Windows provides location specifically for temp files (%TEMP%)
  2. For small data, you could use registry, although in most cases it's not a proper use
  3. Memory-mapped file, it's similar to file but in RAM
  4. As Royi properly mentioned, NamedPipeStream is a way to go if you decide to give pipes a try
  5. You could create a WCF endpoint. It sounds like a drag, but Visual Studio will create you all the scaffolding, so it's not such an issue in the end
  6. Window messages could be used if you are developing forms application, and sometimes even if not
  7. You mentioned that the data is XML, so this methodology is not for you, but I'll mention it anyway: you could use named kernel objects, such as: mutexes, events, semaphores to pass signals from one program to another.
Кроме того: Сделайте один из процессов COM-сервером o-of-of-process и вызовите методы и присоединитесь к событиям на его COM-интерфейсе. Это позволяет двустороннюю связь между процессами.

Похожие вопросы