Process.Start завершается с ошибкой при попытке перенаправить вывод
-
20-09-2019 - |
Вопрос
Я работал над автоматизацией наших процессов сборки и хотел найти безболезненный способ регулярного запуска модульных тестов.С этой целью я собрал простое приложение, которое проверяет файлы проекта и готовит список решений для тестирования.Прототип работает так, что тесты выполняются с ожидаемыми результатами, но как только я пытаюсь перенаправить вывод, приложение взрывается при вызове Process.Start, жалуясь, что файл не найден.
Я попробовал несколько итераций того, что видел где-то еще, включая несколько сообщений здесь, но мне еще предстоит заставить это работать должным образом.
Это работает:
Private Function WTF(ByVal aWorkingDirectory As String, ByVal aFileName As String, ByVal aArguments As String) As Boolean
Dim lProcess As New Process()
With lProcess
.StartInfo.WorkingDirectory = aWorkingDirectory
.StartInfo.FileName = aFileName
.StartInfo.Arguments = aArguments
End With
lProcess.Start()
lProcess.WaitForExit()
End Function
Это не работает:
Private Function WTF(ByVal aWorkingDirectory As String, ByVal aFileName As String, ByVal aArguments As String) As Boolean
Dim lProcess As New Process()
With lProcess
.StartInfo.CreateNoWindow = True
.StartInfo.UseShellExecute = False
.StartInfo.RedirectStandardOutput = True
.StartInfo.RedirectStandardError = True
.StartInfo.WorkingDirectory = aWorkingDirectory
.StartInfo.FileName = aFileName
.StartInfo.Arguments = aArguments
End With
lProcess.EnableRaisingEvents = True
AddHandler lProcess.OutputDataReceived, AddressOf blah
AddHandler lProcess.ErrorDataReceived, AddressOf blah
lProcess.Start()
lProcess.BeginOutputReadLine()
lProcess.BeginErrorReadLine()
lProcess.WaitForExit()
End Function
Private Shared Sub blah(ByVal sender As Object, ByVal e As System.Diagnostics.DataReceivedEventArgs)
Console.WriteLine(e.Data)
End Sub
«System.ComponentModel.Win32Exception:Система не может найти файл, указанный по адресу system.diagnostics.process.startwithcreateprocess (processstartinfo startinfo) на system.diagnostics.process.start () ...Йадда Йадда Йадда"
Любые предложения по решению этой проблемы с использованием этой модели будут оценены по достоинству.
Решение
UseShellExecute заставляет искать файл в разных местах.
От MSDN:
Свойство WorkDirectory ведет себя по-разному, если UseShellExecute имеет значение true, чем когда UseShellExecute имеет значение false.Если UseShellExecute имеет значение true, свойство WorkDirectory указывает расположение исполняемого файла.Если «WorkingDirectory» — пустая строка, считается, что текущий каталог содержит исполняемый файл.
Если UseShellExecute имеет значение false, свойство WorkDirectory не используется для поиска исполняемого файла.Вместо этого он используется запущенным процессом и имеет значение только в контексте нового процесса.