2012-05-31 2 views
1

Все, я разрабатываю приложение, которое должно запускать другое приложение во время выполнения. Чтобы запустить стороннее приложение, я использую System.Diagnostics.Process и чтобы я никогда не запускал стороннее приложение дважды, я использую одноэлементный шаблон.Использование System.Diagnostics.Process для запуска стороннего приложения

Синглтон необходим, но Process.Start() способ нет. То есть, хотя я получаю тот же объект Process, возвращенный из singleton, Start() запускает другой экземпляр приложения третьей части.

От MSDN - Process.Start() page:

"Starts (or reuses) the process resource that is specified by the StartInfo property 
of this Process component and associates it with the component." 

предположить, что он должен повторно использовать экземпляр Process. Что мне не хватает?

Спасибо за ваше время.

+0

ли проверить вас, если последний процесс все еще работает до вызова 'Start() 'снова? (Использование свойства 'HasExited'.) – Thomas

+0

Я могу, но запутанная вещь заключается в том, что документация предполагает, что это будет обработано вызовом' Start() '. – MoonKnight

ответ

1

Вот функция я использую для запуска сторонних приложений:

public static void ProcessStart(string ExecutablePath, string sArgs, bool bWait) 
    { 
     System.Diagnostics.Process proc = new System.Diagnostics.Process(); 
     proc.EnableRaisingEvents = false; 
     proc.StartInfo.FileName = ExecutablePath; 

     if(sArgs.Length > 0) 
      proc.StartInfo.Arguments = sArgs; 


     proc.Start(); 

     if(bWait) 
      proc.WaitForExit(); 

     if(ProcessLive(ExecutablePath)) 
      return true; 
     else 
      return false;    

    } 

ExecutablePath: Полный путь к исполняемому файлу

SARGS: аргументы командной строки

bWait: Подождите, пока процесс в exit

В моем случае я использую вторичную функцию, чтобы определить, запущен ли процесс. Это не совсем то, что вы ищете, но он все равно будет работать:

public static bool ProcessLive(string ExecutablePath) 
    { 
     try 
     { 

      string strTargetProcessName = System.IO.Path.GetFileNameWithoutExtension(ExecutablePath); 

      System.Diagnostics.Process[] Processes = System.Diagnostics.Process.GetProcessesByName(strTargetProcessName); 

      foreach(System.Diagnostics.Process p in Processes) 
      { 
       foreach(System.Diagnostics.ProcessModule m in p.Modules) 
       { 
        if(ExecutablePath.ToLower() == m.FileName.ToLower()) 
         return true; 
       } 
      } 
     } 
     catch(Exception){} 

     return false; 

    } 
1

Возможно, вам стоит подумать об использовании Process.GetProcessesByName, чтобы понять, запущено ли это приложение, которое вы запускаете.

+0

+1 Спасибо, что это варианты, но, как я сказал в комментарии выше. MSDN предполагает, что это будет обрабатываться с помощью 'Start()'? – MoonKnight

0

использовать его следующим образом

Process[] chromes = Process.GetProcessesByName("ProcessName"); to check whether ur process is already running or not. Based on the u can use the process already running. 
Смежные вопросы