Process.Start non riesce quando si tenta di reindirizzare l'output
-
20-09-2019 - |
Domanda
Ho lavorato su come automatizzare i nostri processi di build e volevo trovare un modo indolore per eseguire unit test su base regolare. A tal fine ho buttato insieme una semplice applicazione che esamina i file di progetto e prepara un elenco di soluzioni da testare. Il prototipo funziona in quanto i test vengono eseguiti con i risultati attesi, ma non appena provo a riorientare la mia uscita le bombe app sulla chiamata Process.Start, lamentando che un file non è stato trovato.
Ho provato diverse iterazioni su quello che ho visto fare altrove, tra cui diversi posti qui, ma devo ancora convincere questo per funzionare correttamente.
Questo funziona:
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
Questo non funziona:
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: il sistema non riesce a trovare il file specificato a System.Diagnostics.Process.StartWithCreateProcess (ProcessStartInfo startInfo) a System.Diagnostics.Process.Start () ... bla bla bla "
Qualche suggerimento per risolvere questo utilizzando questo modello sarebbe apprezzato.
Soluzione
UseShellExecute fa sì che il file da cercare in luoghi diversi.
MSDN :
La proprietà WorkingDirectory comporta in modo diverso quando UseShellExecute è vero che quando UseShellExecute è falsa. Quando UseShellExecute è vero, la proprietà WorkingDirectory specifica la posizione del file eseguibile. Se WorkingDirectory è una stringa vuota, la directory corrente si intende contenere l'eseguibile.
Quando UseShellExecute è falsa, la proprietà WorkingDirectory non viene usato per trovare l'eseguibile. Invece, viene utilizzato dal processo che viene avviato e ha senso solo nel contesto del nuovo processo.