Process.Start falla al intentar redirigir la salida
-
20-09-2019 - |
Pregunta
He estado trabajando en la automatización de los procesos de construcción y quería llegar a un método indoloro para ejecutar pruebas unitarias sobre una base regular. Con ese fin he tirado juntos una aplicación sencilla que examina los archivos de proyecto y prepara una lista de soluciones para poner a prueba. El prototipo funciona en el que las pruebas se ejecutan con los resultados esperados, pero tan pronto como lo intento de redirigir mi salida de las bombas de aplicaciones en la llamada Process.Start, quejándose de que un archivo no se pudo encontrar.
He intentado varias iteraciones en lo que he visto hacer en otros lugares, incluyendo varios puestos aquí, pero todavía tengo que conseguir que esto funcione correctamente.
Esto funciona:
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
Esto no funciona:
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: El sistema no puede encontrar el archivo especificado en System.Diagnostics.Process.StartWithCreateProcess (ProcessStartInfo startInfo) en System.Diagnostics.Process.Start () ... bla bla bla "
Cualquier sugerencias para la solución de este uso de este modelo sería apreciada.
Solución
UseShellExecute hace que el archivo que se buscó en diferentes lugares.
MSDN :
La propiedad WorkingDirectory se comporta de forma diferente cuando UseShellExecute es cierto que cuando UseShellExecute es falsa. Cuando UseShellExecute es cierto, la propiedad WorkingDirectory especifica la ubicación del archivo ejecutable. Si WorkingDirectory es una cadena vacía, el directorio actual se entiende para contener el ejecutable.
Cuando UseShellExecute es falsa, la propiedad WorkingDirectory no se utiliza para encontrar el ejecutable. En su lugar, se utiliza por el proceso que se inicia y sólo tiene sentido en el contexto del nuevo proceso.