Что делать с межпроцессным взаимодействием между двумя процессами?

Мне нужна помощь в отношении межпроцессного взаимодействия.

У меня есть приложение A и приложение B. Целью приложения B является обновление приложения A. Поскольку приложение A не может обновлять себя, должны быть обновлены некоторые dll, поэтому используется Applicaiton B. Приложение A запускает приложение B, а приложение B закрывает приложение A и начинает обновление A. Процесс обновления состоит из двух шагов: 1) копирует биты msi 2) устанавливает биты

Если пользователь отменяет приложение B на первом этапе, пока приложение A находится в ожидании, есть ли какой-либо способ сигнализировать приложению A о продолжении запуска приложения A, поскольку обновление было отменено.

Каков наилучший способ добиться этого и как? Является ли Mutex единственным решением?


person alice7    schedule 17.09.2011    source источник
comment
mutex, безусловно, не единственное решение. У вас есть полный контроль над обоими приложениями, и это два приложения Windows Forms или WPF? если B отменяется, что вы хотите, чтобы A продолжал делать? Снова открыть B или проигнорировать и продолжать работать в обычном режиме?   -  person Davide Piras    schedule 17.09.2011
comment
Оба являются приложениями WPF. Да, у меня есть контроль. Если B отменяется, я хочу, чтобы A продолжалось в обычном режиме   -  person alice7    schedule 17.09.2011
comment
Вы можете отредактировать свой вопрос с более подробной информацией? Например, может ли пользователь продолжать использовать A, пока B работает? зачем вам два отдельных приложения?   -  person Davide Piras    schedule 17.09.2011
comment
@David: я добавил более подробное описание своей проблемы.   -  person alice7    schedule 17.09.2011


Ответы (3)


Взгляните на XDMessaging, который использует Windows Messaging или File IO для IPC. Вы также можете использовать глобальный мьютекс или Семафор для обеспечения базовой сигнализации.

В качестве альтернативы базовый подход (если это подходит). Следующее запускает приложение B в новом процессе и блокирует его до выхода. Вы можете использовать коды выхода для управления поведением.

Process appB = Process.Start("C:\\applicationb.exe");
appB.WaitForExit();
int exitCode = appB.ExitCode;

Вы также можете создать MSI-файл обновления, который запускается параллельно с некоторым настраиваемым диалоговым окном, и использовать настраиваемое действие, чтобы закрыть другое приложение перед обновлением. Есть несколько способов добиться этого, от уничтожения процесса до подачи сигнала через Windows Messaging.

person TheCodeKing    schedule 17.09.2011
comment
Я не хочу использовать стороннюю библиотеку :( - person alice7; 17.09.2011
comment
Вы всегда можете использовать Process с WaitForExit, чтобы продолжить, когда второе приложение выйдет, это то, что вы хотите? - person TheCodeKing; 17.09.2011
comment
Я думаю, это то, что я хотел. - person alice7; 17.09.2011
comment
Я думал, что А запускает Б, а А продолжает работать. Если B отменяется, B завершается, а A продолжается (не перезапускается). В противном случае A выходит, а B продолжает. WaitForExit в A будет работать только в том случае, если B завершает A. Но, вероятно, A хочет закрыть себя контролируемым образом. - person erikH; 17.09.2011

Я бы не стал использовать Mutex для этого. Я бы использовал EventWaitHandle. См. раздел Отправить сообщение из одного работающего консольного приложения в другое. для получения подробной информации.

person Jim Mischel    schedule 17.09.2011

Я не думаю, что это следует делать с помощью IPC. Я думаю, что B должен начать A, если пользователь отменит загрузку.

Это,

  1. A умирает, как только начинается B.
  2. B загрузите, а затем примените msi
  3. B запускает A и выходит. Это происходит независимо от того, завершена загрузка или нет.
person Miserable Variable    schedule 17.09.2011