Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 外部命令行进程永远不会返回_.net_Vb.net_Command Line_Aapt - Fatal编程技术网

.net 外部命令行进程永远不会返回

.net 外部命令行进程永远不会返回,.net,vb.net,command-line,aapt,.net,Vb.net,Command Line,Aapt,我使用以下vb.net代码运行外部命令行应用程序并读取其输出: Public Shared Function Execute(ByVal command As String, ByVal params As String, ByVal workingdir As String) As String psi = New ProcessStartInfo(command) psi.WorkingDirectory = workingdir psi.RedirectStanda

我使用以下vb.net代码运行外部命令行应用程序并读取其输出:

Public Shared Function Execute(ByVal command As String, ByVal params As String, ByVal workingdir As String) As String
    psi = New ProcessStartInfo(command)
    psi.WorkingDirectory = workingdir
    psi.RedirectStandardOutput = True
    psi.WindowStyle = ProcessWindowStyle.Hidden
    psi.UseShellExecute = False
    psi.CreateNoWindow = True
    psi.Arguments = params
    proc = Process.Start(psi)
    Dim myOutput = proc.StandardOutput
    proc.WaitForExit() 'Problem is here!!!!!!
    Dim ret = myOutput.ReadToEnd
    Return ret
End Function
此代码已在多个应用程序中完美运行。。。直到现在。 问题是:我现在用它在一堆文件上运行“aapt.exe”(一个提供android apk应用程序信息的工具),代码被卡住(永远不会返回)在我评论的地方,但在总共81个文件中,只有3个文件

当然,我的第一个想法是外部程序在这些特定文件上失败/卡住了,但我在命令提示符下手动测试了同一个命令,它工作得非常好! 此外:我在代码中添加了一个超时,如下所示:

    proc.WaitForExit(10000)
在这种情况下,进程返回(显然),但有趣的是,输出是正确和完整的这意味着外部程序在结束前一直正常运行,那么为什么进程不能自行返回??有什么可行的方法来调试这个吗

谢谢

编辑:
经过数小时的测试,我得出结论,问题在于“RedirectStandardOutput”选项。无论我执行/读取哪个命令,它都会挂起一些执行。我没有找到一个合适的解决方案,我实现了一个(可怕的)解决方案,在这里我禁用标准输出重定向,而是将标准输出输出到一个文件,然后在进程终止时立即在代码中重新读取它(它至少以这种方式正确终止)。这不是一个优雅的解决方案,我仍然想弄清这个问题的真相,所以如果有人有比我更好的想法,我就把这个问题留给大家。

我想你可能只需要在
proc.WaitForExit()之前调用
Dim ret=myOutput.ReadToEnd
。首先调用WaitForExit()时发出死锁警告:“如果父进程在p.StandardOutput.ReadToEnd之前调用p.WaitForExit,并且子进程写入足够的文本以填充重定向流,则可能导致死锁情况。父进程将无限期地等待子进程退出。子进程将无限期地等待父进程从完整的StandardOutput流中读取。“因此,我猜这3/81文件的输出量比其他文件要多。

我认为您可能只需要在
proc.WaitForExit()之前调用
Dim ret=myOutput.ReadToEnd
。首先调用WaitForExit()会警告死锁:“如果父进程在p.StandardOutput.ReadToEnd之前调用p.WaitForExit,并且子进程写入足够的文本以填充重定向流,则可能会导致死锁情况。父进程将无限期地等待子进程退出。子进程将无限期地等待父进程从完整的StandardOutput流中读取数据。“因此,我猜这些3/81文件的输出量比其他文件多。

您是否尝试将/C参数添加到末尾,以便它在退出后返回。 e、 g.cmd/C“abc.exe”


此处“/C”很重要,它告诉命令提示符在完成后退出。

您是否尝试将/C参数添加到末尾,以便它在退出后返回。 e、 g.cmd/C“abc.exe”


此处“/C”很重要,它告诉命令提示符在完成后退出。

您是否尝试过在其中一个问题文件上运行该程序(从命令行)查看其行为是否与使用一个无问题文件运行时有任何不同?可能程序在完成所有处理后挂起。@吉姆:是的,请阅读我的所有问题,正如我所说:从命令行完全运行。失败文件的名称是什么?这些文件名是否在
params
参数中传递?@Matt是的。失败的是:Contacts.apk、latime.apk、Settings.apk我甚至手动查看了输出,但似乎与其他文件没有什么不同……您是否尝试过在其中一个问题文件上运行程序(从命令行)查看其行为是否与使用一个无问题文件运行时有任何不同?可能程序在完成所有处理后挂起。@吉姆:是的,请阅读我的所有问题,正如我所说:从命令行完全运行。失败文件的名称是什么?这些文件名是否在
params
参数中传递?@Matt是的。失败的是:Contacts.apk、latime.apk、Settings.apk我甚至手动查看了输出,但似乎与其他文件没有什么不同……不,这不是问题,我尝试了反转,结果是一样的。另外:还有几个其他文件生成的输出比有问题的三个文件多。不,这不是问题,我尝试了反转,结果是一样的。另外:有几个其他文件比有问题的三个文件生成更多的输出。