Рекомендация: App1.exe запускает процесс App2.exe, затем App2.exe необходимо закрыть App1.exe - PullRequest
0 голосов
/ 10 февраля 2011

Добрый день.

Мне нужно признать, что это странная работа, но она мне нужна ...: -)

Сегодня существует консольное приложение C # (я назову его App1.exe), которое было вызвано моими коллегами и работает в COBOL. Когда App1.exe завершает свою работу, закрывается, программы COBOL могут продолжить чтение файлов, сгенерированных из App1.

Это приложение 1 открывается и закрывается сто раз в день, и это не так быстро ... Теперь мне нужно получить бизнес-логику в приложении systray, которое всегда готово, чтобы быстро отвечать на запросы, но я не могу заставить своих коллег изменить свои программы: они будут вызывать App1.exe, ожидая, пока он закроется. Поэтому я создаю один istance App2.exe (я не могу использовать системные службы), который выполняет эту работу; так что теперь я подумал об этом решении: App1.exe просто вызывает App2.exe (передавая аргументы командной строки), затем остается в режиме ожидания (с помощью Process.Start (App2.exe) и Process.WaitForExit ()). Когда App2.exe завершает работу, убивает App1.exe, поэтому программы на COBOL могут обнаружить, что работа выполнена, и продолжить чтение файлов, созданных из App2.exe.

В этом решении (быстрым и грязным способом, я просто пытаюсь ...) есть проблема: App1.exe был вызван App1.exe, поэтому кажется, что вызываемый exe не может убить его родителя, не так ли это?

Есть лучший / рекомендуемый способ сделать такую ​​работу? Я могу использовать только C # 2.0.

Спасибо, ребята, любая идея приветствуется.
Nando

Ответы [ 4 ]

2 голосов
/ 10 февраля 2011

Используйте один из механизмов межпроцессного взаимодействия, чтобы app1.exe взаимодействовал с app2.exe. Розетки, именованные трубы, Remoting, WCF. Поскольку вам нужно только передать командную строку, простой сокет может выполнить работу. Просто выйдите из app1.exe, когда вы получите сообщение от app2.exe, что задание выполнено, не нужно ничего убивать.

0 голосов
/ 14 февраля 2011

Я нашел интересный проект: WCF Killer .
Это простая, но мощная реализация клиент-серверного стека TCP; вероятно, хорошее решение для моих нужд.
Пока, Нандо

0 голосов
/ 10 февраля 2011

Это код, который я использую для вызова и уничтожения процесса.

//App1.exe
var p = Process.Start("App2.exe", myargs);
p.WaitForExit();

//App2.exe
//do the work calling my App2.exe business logic plugin...
//Close calling exe; caller variable is fullpath of my App1.exe, like D:\myapp\app1.exe
Process[] pArry = Process.GetProcesses();
foreach (Process p in pArry)
{
    string s = p.ProcessName;
    s = s.ToLower();
    if (s.CompareTo(caller) == 0)
    {
        p.Kill();
    }
}

Действительно простой код, возможно, слишком простой для работы: -)
Спасибо!

0 голосов
/ 10 февраля 2011

Создайте приложение менеджера / монитора, которое контролирует весь процесс.Создает новое дочернее приложение по требованию (App1).Затем приложение App1 может запросить, чтобы приложение App2 было запущено, задав диспетчеру / монитору.

Если приложение App2 затем захочет закрыть приложение App1, оно может попросить менеджера / монитора сделать это.отлаживать, регистрировать, отслеживать, проверять и устанавливать правила для каждого запуска / остановки каждого приложения.Гораздо лучше!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...