2016-04-10 3 views
-1

У меня есть консольное приложение, которое вызывает другие консольные приложения.C# Process.Start - как обеспечить соблюдение WaitForExit

Я использую следующую ссылку МЕТОДИЧЕСКИЙ: https://robindotnet.wordpress.com/2010/03/21/how-to-pass-arguments-to-an-offline-clickonce-application/

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

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

Process.Start(shortcutPath, arguments); 

или

Process.Start(shortcutPath, arguments).WaitForExit(); 

Однако, я не могу получить процесс в WaitForExit - одно приложение называется и через некоторое время, до завершения первого приложения, вторая называется - что является проблемой так как это зависит от первого приложения.

Любые предложения о том, как получить статическую версию процесса ждать выхода (альт., Как создать экземпляр процесса и иметь возможность вызывать ClickOnce развернутые приложения?)

+0

Ваша переменная называется 'shortcutPath'. Вы запускаете ярлык (файл .lnk') или исполняемый файл (файл .exe)? – yaakov

+0

При развертывании приложений clickonce вы получаете ссылку, указывающую на то, что MS развертывает ваш фактический exe. Я вызываю этот appref. Он будет выглядеть примерно так: C: \ Users \ User Name \ AppData \ Roaming \ Microsoft \ Windows \ Start Menu \ Programs \ xxx \ xxx \ xxx.appref-ms –

+0

Я могу пойти и выполнить поиск этих exe'ов и выполнить нормальная process.start вещь, но затем каждый раз, когда я повторно развертываю вызываемые приложения, я должен обновить путь к файлу в вызывающем приложении и перераспределить это. –

ответ

0

Хорошо, после того, как колотить головой о стену за лучшую часть дня, я нашел это ... Start an offline ClickOnce Application and wait for Exit

Используется опция мьютекса. Fek me Microsoft, вы взяли то, что было действительно просто и сделало из него настоящую лошадь.

Я как раз собирался отказаться от моего вызова exe's и создать одного монстра - было плохо в этой мысли.

0

Process.Start метод (String, String) имеет возвращаемое значение System.Diagnostics.Process

который согласно https://msdn.microsoft.com/en-us/library/h6ak8zt5%28v=vs.110%29.aspx является:

новый процесс, который связан с процессом ресурса, или нулевое значение, если не будет запущен ни один ресурс процесса. Обратите внимание, что новый процесс, который запускается рядом с уже запущенными экземплярами одного и того же процесса, будет независимым от других. Кроме того, Start может возвращать ненулевой процесс с свойством HasExited, уже установленным в true. В этом случае запущенный процесс может активировать существующий экземпляр самого себя, а затем выйти.

Так что я бы проверить, является ли process.HasExited верно перед вызовом WaitForExit

var process = Process.Start(shortcutPath, arguments); 
if (process != null && process.HasExited != true) 
{ 
    process.WaitForExit(); 
} 
else 
{ 
    // Process is null or have exited 
} 
+0

Вы можете вызвать WaitForExit для процесса, который уже вышел. Если бы вы этого не сделали, этот код вводит условие гонки. – yaakov

+0

foobar - попробовал это. Это не имеет никакого значения - обработка просто переходит к следующему вызову. Если я пройду через код и попытаюсь посмотреть, какое значение имеет значение var var, я получаю «BasePriority =» process.BasePriority, который выбрал исключение типа «System.InvalidOperationException» ». Хотя код находится в блоке try/catch, это не вызывает исключения ... –

+0

Примечание: даже при исследовании процесса var вызывает ошибку, вызов exe работает без проб. –