System.Diagnostics.Process ExitCode 1
Я использую простой C# статический метод для запуска приложения Windows. Все отлично работает со всеми 32 или 64-битными приложениями, кроме iexplore.exe.
Когда я звоню:
ExecHttp(@"C:\Program Files (x86)\Internet Explorer\iexplore.exe", "http://www.google.it");
Метод System.Diagnostics.Process WaitForExit() не ожидает закрытия iexplore.exe, а ExitCode возвращает код выхода =1.
Вот ExecHttp:
public static int ExecHttp(String strURL, String strArguments)
{
int intExitCode = 99;
try
{
Process objProcess = new System.Diagnostics.Process();
strArguments = "-nomerge " + strArguments;
System.Diagnostics.ProcessStartInfo psi = new ProcessStartInfo(strURL, strArguments);
psi.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
psi.UseShellExecute = true;
objProcess.StartInfo = psi;
objProcess.Start();
Thread.Sleep(2000);
objProcess.WaitForExit();
intExitCode = objProcess.ExitCode;
objProcess.Close();
}
catch (Exception ex)
{
//log the exception
throw;
}
return intExitCode;
}
Я провел большой поиск, и единственный найденный способ - добавить ключевое слово -nomerge в свойство аргументов System.Diagnostic.Process.ProcessStartInfo. WaitForExit() прекрасно работает с другими процессами Windows.exe, но НЕ с процессом iexplore.exe. Как мы можем проверить состояние процесса iexplore.exe?
Спасибо
1 ответ
Наконец, я реализовал это решение, я не удовлетворен, но он работает. После открытия нового uri с аргументом -nomerge мы ждем три секунды и, наконец, ищем новый процесс, которому принадлежит эта новая страница. Теперь мы вызываем WaitForExit(), который работает как положено, вот мой код, любые предложения приветствуются:
public static int ExecHttp(String strBrowserApp, String strURL, String strSessionName, ref String strMessage)
{
int intExitCode = 99;
try
{
strMessage = String.Empty;
System.Diagnostics.Process.Start(strBrowserApp, "-nomerge " + (String.IsNullOrEmpty(strURL) ? "" : strURL));
System.Threading.Thread.Sleep(3000);
System.Diagnostics.Process objProcess = null;
System.Diagnostics.Process[] procs = System.Diagnostics.Process.GetProcesses();
foreach (System.Diagnostics.Process proc in procs.OrderBy(fn => fn.ProcessName))
{
if (!String.IsNullOrEmpty(proc.MainWindowTitle) && proc.MainWindowTitle.StartsWith(strSessionName))
{
objProcess = proc;
break;
}
}
if (objProcess != null)
{
objProcess.WaitForExit();
intExitCode = 0;
objProcess.Close();
}
}
catch (Exception ex)
{
strMessage = ex.Message;
}
}