Pergunta

Eu tenho trabalhado para automatizar nossos processos de construção e queria criar uma maneira indolor de executar testes de unidade regularmente. Para esse fim, joguei um aplicativo simples que examina os arquivos do projeto e prepara uma lista de soluções para testar. O protótipo funciona na medida em que os testes são executados com os resultados esperados, mas assim que eu tento redirecionar minha saída, as bombas de aplicativos no processo.

Eu tentei várias iterações sobre o que vi feito em outro lugar, incluindo várias postagens aqui, mas ainda tenho que isso funcionar corretamente.

Isso 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

Isso não 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: O sistema não pode encontrar o arquivo especificado em system.diagnostics.process.startwithcreateprocess (processStartinfo startinfo) em system.diagnostics.process.start () ... yadda yadda yadda"

Quaisquer sugestões para resolver isso usando este modelo seriam apreciadas.

Foi útil?

Solução

O uso de useshellexecute faz com que o arquivo seja procurado em lugares diferentes.

A partir de Msdn:

A propriedade Diretor de trabalho se comporta de maneira diferente quando a Useshellexecute é verdadeira do que quando o uso de usashellexecute é falso. Quando a USeshellexecute é verdadeira, a propriedade Diretor de trabalho especifica o local do executável. Se o WorkingDirectory for uma string vazia, o diretório atual é entendido como conter o executável.

Quando o uso de usashellexecute é falso, a propriedade Diretor de Working Directory não é usada para encontrar o executável. Em vez disso, é usado pelo processo iniciado e tem significado apenas no contexto do novo processo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top