我使用 C# 创建了一个控制台应用程序,并使用以下命令从另一个 Windows 窗体应用程序调用它Process
.
下面是我的控制台应用程序代码
static void Main(string[] args)
{
try
{
// ...my code
}
catch (Exception)
{
throw;
}
}
下面是使用进程从窗口应用程序调用控制台应用程序的exe的代码
public void CallExe()
{
try
{
Process proc = new Process();
proc.StartInfo.FileName = @"D:\Debug\console1.exe";
proc.StartInfo.Arguments = "My args";
proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.RedirectStandardError = true;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
proc.Start();
proc.WaitForExit();
string stdout = proc.StandardOutput.ReadToEnd();
string stderr = proc.StandardError.ReadToEnd();
proc = null;
}
catch (Exception ex)
{
throw ex;
}
}
现在,我想要的是当控制台应用程序出现任何错误时
它直接抛出到我的窗口应用程序 catch 块。或者我可以将控制台应用程序抛出的错误消息发送到我的窗口应用程序吗?
您没有从您运行的进程中捕获任何内容。你不能打电话ReadToEnd
在两个流上,因为它会阻止其中一个或另一个产生结果。如果您想将标准输出捕获为标准错误,您需要订阅收到数据 https://msdn.microsoft.com/en-us/library/system.diagnostics.process.errordatareceived(v=vs.110).aspx事件并存储事件参数中的数据。
Windows 窗体应用程序中的以下代码应如下所示:
Process proc = new Process();
proc.StartInfo.FileName = @"console.exe";
proc.StartInfo.Arguments = "My args";
proc.StartInfo.CreateNoWindow = false;
proc.StartInfo.RedirectStandardError = true;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
//store outcome of process
var errors = new StringBuilder();
var output = new StringBuilder();
var hadErrors = false;
// raise events
proc.EnableRaisingEvents = true;
// capture normal output
proc.OutputDataReceived += (s, d) => {
output.Append(d.Data);
};
// Capture error output
proc.ErrorDataReceived += (s, d) => {
if (!hadErrors)
{
hadErrors = !String.IsNullOrEmpty(d.Data);
}
errors.Append(d.Data);
};
proc.Start();
// start listening on the stream
proc.BeginErrorReadLine();
proc.BeginOutputReadLine();
proc.WaitForExit();
string stdout = output.ToString();
string stderr = errors.ToString();
if (proc.ExitCode !=0 || hadErrors)
{
MessageBox.Show("error:" + stderr);
}
在测试控制台应用程序中,您现在可以写入 stderr 并设置退出代码(如果您愿意):
try
{
Console.WriteLine("Ready ...");
var cmd = Console.ReadLine();
if (cmd == "e")
{
throw new Exception("boom");
} else
{
Console.WriteLine("success!");
}
Environment.ExitCode = 0;
}
catch(Exception e)
{
// write to stderr
Console.Error.WriteLine(e.Message);
// exit code to 1
Environment.ExitCode = 1;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)