C# Process.Start(processInfo)响应为空

C# Process.Start(processInfo)响应为空,c#,.net,C#,.net,我需要使用System.Diagnostics.Process.Start(processInfo)调用exe,并希望返回一些值。根据返回值,我需要执行进一步的操作。Exe正在被调用并准确地执行任务,但我无法获取返回值。process.Start()之后,代码被卡住。没有异常或警告 string arguments = arg[0]+ " " + arg[1] + " " + arg[2] + " " + arg[3]; string consoleExePath = @"C:\Test\Con

我需要使用
System.Diagnostics.Process.Start(processInfo)
调用exe,并希望返回一些值。根据返回值,我需要执行进一步的操作。Exe正在被调用并准确地执行任务,但我无法获取返回值。process.Start()之后,代码被卡住。没有异常或警告

string arguments = arg[0]+ " " + arg[1] + " " + arg[2] + " " + arg[3];
string consoleExePath = @"C:\Test\Console.exe";
ProcessStartInfo processInfo = new ProcessStartInfo();
processInfo.WindowStyle = ProcessWindowStyle.Hidden;
processInfo.FileName = "cmd.exe";
processInfo.RedirectStandardOutput = true;
processInfo.UseShellExecute = false;
processInfo.WorkingDirectory = Path.GetDirectoryName(consoleExePath);
processInfo.Arguments = string.Format("/c START {0} {1}", Path.GetFileName(consoleExePath), arguments);
System.Diagnostics.Process p = System.Diagnostics.Process.Start(processInfo);
var output = p.StandardOutput.ReadToEnd();
p.WaitForExit();
int result = p.ExitCode; // always 0
exe中的代码:

static int Main(string[] args)
{
  var flag = 0;
  flag=   objTest.DoSomething(args[0],args[1], args[2], args[3]);
  //Console.WriteLine("Process completed!");
  //Console.Read();
  //return flag;
  return 44; // a non zero value.
}

编辑:由于
Console.Read(),代码执行受阻。感谢施纳德抓住了这个愚蠢的错误。但是
var output=p.StandardOutput.ReadToEnd()仍然为空。尝试
int结果=p.ExitCode
结果总是
0

您的代码对我有效。请注意,在.exe代码中,有一行:

Console.Read();
因此,程序将等待用户输入一行,然后才退出。如果不这样做,其他代码将按照您所描述的那样等待应用程序终止

因此,您应该删除该行并重试


Christian.K在评论中指出的另一种可能性是使用
processInfo.RedirectStandardInput=true
重定向标准输入。这样,您就不必修改.exe代码。之后,您可以将内容重定向到.exe的标准输入,请参阅。

您的代码适合我。请注意,在.exe代码中,有一行:

Console.Read();
因此,程序将等待用户输入一行,然后才退出。如果不这样做,其他代码将按照您所描述的那样等待应用程序终止

因此,您应该删除该行并重试



Christian.K在评论中指出的另一种可能性是使用
processInfo.RedirectStandardInput=true
重定向标准输入。这样,您就不必修改.exe代码。之后,您可以将内容重定向到.exe的标准输入,请参见。

该.exe代码调用
Console.Read()
,它将等待用户输入一行,然后才退出-您考虑到了吗?您没有启动exe-您启动的是
cmd.exe
,而这反过来又启动了您的exe,出于某种原因。控制台进程成功完成并返回
0
。它不会传回上次执行的任何内容的返回代码。达米恩·阿努斯·阿努斯·阿努斯·阿努斯·阿努斯·阿努斯·阿努斯·阿努斯·阿努斯·阿努斯·阿努斯·阿努斯:你能建议所需的更改吗?这取决于-大概是在早些时候你有
.FileName=consoleExePath
.Arguments=Arguments
。什么,特别是,你是这样做的,你决定把<代码> CMD < /代码>放在中间?DamiiNeth-Ty-UnistiFue:我正在尝试它,没有<代码> CMD。我会把它贴在这里。谢谢。exe代码调用
Console.Read()
,它将等待用户输入一行,然后才退出-您考虑到了吗?您没有启动exe-您启动的是
cmd.exe
,出于某种原因,它反过来会启动您的exe。控制台进程成功完成并返回
0
。它不会传回上次执行的任何内容的返回代码。达米恩·阿努斯·阿努斯·阿努斯·阿努斯·阿努斯·阿努斯·阿努斯·阿努斯·阿努斯·阿努斯·阿努斯·阿努斯:你能建议所需的更改吗?这取决于-大概是在早些时候你有
.FileName=consoleExePath
.Arguments=Arguments
。什么,特别是,你是这样做的,你决定把<代码> CMD < /代码>放在中间?DamiiNeth-Ty-UnistiFue:我正在尝试它,没有<代码> CMD。我会把它贴在这里。谢谢。或者,他可以使用
RedirectStandardInput=true
之后,在
Start()
之后,
p.StandardInput.Close()标志)在
p.ExitCode
中,在
p.WaitForExit()
call之后可用。schnaader:p.ExitCode始终返回0。即使我已经将返回值硬编码为非零。啊,您正在运行“cmd/c start{0}{1}”,它不采用console.exe的退出代码。尝试直接运行exe,例如
processInfo.FileName=@“C:\Test\Console.exe”
processInfo.Arguments=Arguments
或者,他可以使用
RedirectStandardInput=true
之后,在
Start()
之后,
p.StandardInput.Close()标志)在
p.ExitCode
中,在
p.WaitForExit()
call之后可用。schnaader:p.ExitCode始终返回0。即使我已经将返回值硬编码为非零。啊,您正在运行“cmd/c start{0}{1}”,它不采用console.exe的退出代码。尝试直接运行exe,例如
processInfo.FileName=@“C:\Test\Console.exe”
processInfo.Arguments=Arguments