Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.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
C# 通过process.Start(startInfo)在另一个进程上的奇怪行为 我们的C(V3.5)应用程序需要调用另一个公司的C++可执行文件。我们需要向它传递一个原始数据文件名,它将处理该原始数据(大约7MB)文件并生成16个结果文件(每个文件大约124K)_C#_.net - Fatal编程技术网

C# 通过process.Start(startInfo)在另一个进程上的奇怪行为 我们的C(V3.5)应用程序需要调用另一个公司的C++可执行文件。我们需要向它传递一个原始数据文件名,它将处理该原始数据(大约7MB)文件并生成16个结果文件(每个文件大约124K)

C# 通过process.Start(startInfo)在另一个进程上的奇怪行为 我们的C(V3.5)应用程序需要调用另一个公司的C++可执行文件。我们需要向它传递一个原始数据文件名,它将处理该原始数据(大约7MB)文件并生成16个结果文件(每个文件大约124K),c#,.net,C#,.net,调用该可执行文件的代码如下: ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.CreateNoWindow = true; startInfo.UseShellExecute = false; startInfo.RedirectStandardError = true; startInfo.RedirectStandardOutput = true; startInfo.WindowStyle = ProcessWi

调用该可执行文件的代码如下:

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.CreateNoWindow = true;
startInfo.UseShellExecute = false;
startInfo.RedirectStandardError = true;
startInfo.RedirectStandardOutput = true;
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.FileName = exePath;
startInfo.Arguments = rawDataFileName;
try
{
Process correctionProcess = Process.Start(startInfo);
correctionProcess.WaitForExit();
}
catch(nvalidOperationException ex)
{
....
}
catch(...)
...
它很好用。现在我们有了新的原始数据。用新的原始数据文件替换旧的原始数据后。那个可执行的过程永远不会回到我们身边。它将永远悬挂。如果我们杀死C#应用程序,这些结果文件将在目标目录中生成。看起来,可执行文件确实创建了这些结果文件,但在进程终止之前,无法写入磁盘并返回给我们

旧的原始数据文件不是这样的

当我们直接使用新的原始数据运行可执行文件时(C#app调用中没有),它工作正常。这意味着这个可执行文件对新的原始数据没有问题

我的问题1:这种行为的可能原因是什么

现在我用
startInfo.UseShellExecute=true来更改代码并添加
startInfo.WorkingDirectory=…,
并禁用

//startInfo.RedirectStandardError = true;
//startInfo.RedirectStandardOutput = true;
然后它就起作用了

我的问题2:为什么使用Windows Shell解决此问题

我的问题3:为什么以前不使用Shell就可以工作

我的问题4:什么时候应该使用Shell,什么时候不应该


谢谢,

我知道这是一个很常见的问题。我必须处理输出,它必须异步处理。当输出超过一定数量的数据时,就不能等待ForExit

您需要添加

myStdErr= correctionProcess.StandardError.ReadToEnd();
通常只有一次有效,如果你想过度使用它(“p”是我的流程)

有几种可能性:

  • 您正在重定向输出和错误,但没有读取它。当进程的stdout或stderr缓冲区已满时,进程将暂停
  • 程序可能正在显示错误消息并等待按键。您既没有重定向输入,也没有检查stderr,按键永远不会出现
  • 有些程序,xcopy.exe就是一个很好的例子,在重定向stdout时需要重定向stdin。虽然xcopy.exe的故障模式是立即退出,但没有任何诊断

当你杀死你的C#程序时看到它被修复了,这使得第一个子弹成为最有可能的原因。

如果你不需要stdout/stderr,只需将Redirect*属性设置为false。

是的,如果我关闭那些重定向属性,它就会工作,但是如果我已经把它们戴上并读到最后,为什么它不起作用呢?我已经测试了几种不同的组合。我发现只有两个案例适合我:1。使用窗框;2.不使用窗口外壳,不重定向错误和输出。不知道为什么。我已经打印了(到日志文件)以从重定向错误和输出中获取字符串。但没有任何记录。这意味着根本没有错误或输出消息!如果您使用shell,那么您将永远不会重定向、扣篮以获得修复,除了显示的控制台窗口。如果你没有看到它,那么它可能隐藏在你自己的窗口后面,考虑问题得到解决。如果不启用shell和重定向,那么读取stdout和stderr是一项困难的要求。您还没有向我们展示该代码是什么样子的。我在这篇文章中添加了代码:呃,您希望我回答哪一个?
while (!P.HasExited)
  stdErr+= P.StandardError.ReadToEnd();