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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top