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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top