2009-11-17 19 views
0

J'ai travaillé sur l'automatisation de nos processus de construction et je voulais trouver un moyen simple d'exécuter des tests unitaires de façon régulière. À cette fin, j'ai jeté une application simple qui examine les fichiers de projet et prépare une liste de solutions à tester. Le prototype fonctionne en ce sens que les tests sont exécutés avec les résultats attendus, mais dès que j'essaie de rediriger ma sortie, les bombes de l'application sur l'appel Process.Start, se plaignant qu'un fichier n'a pu être trouvé.Process.Start échoue lors de la tentative de redirection de la sortie

J'ai essayé plusieurs itérations sur ce que j'ai vu ailleurs, y compris plusieurs articles ici, mais je n'ai pas encore réussi à le faire fonctionner correctement.

Cela fonctionne:

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 

Cela ne fonctionne pas:

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: Le système ne peut pas trouver le fichier spécifié à System.Diagnostics.Process.StartWithCreateProcess (ProcessStartInfo startInfo) à System.Diagnostics.Process.Start() ... yadda yadda yadda "

Toute suggestion Des solutions pour résoudre ce problème en utilisant ce modèle seraient appréciées. UseShellExecute fait en sorte que le fichier soit recherché à différents endroits.

+0

L'erreur que vous obtenez signifie que 'aFileName' n'a pas été trouvé. – Gonzalo

Répondre

2

De MSDN:

La propriété WorkingDirectory se comporte différemment lorsque UseShellExecute est vrai que quand UseShellExecute est faux. Lorsque UseShellExecute a la valeur true, la propriété WorkingDirectory spécifie l'emplacement de l'exécutable. Si WorkingDirectory est une chaîne vide, le répertoire en cours est censé contenir l'exécutable.

Lorsque UseShellExecute est défini sur false, la propriété WorkingDirectory n'est pas utilisée pour rechercher l'exécutable. Au lieu de cela, il est utilisé par le processus qui est démarré et n'a de sens que dans le contexte du nouveau processus.

+0

Toujours les petites choses - merci! –