仅仅是一个FYI这个问题已经过重新编辑,更加简洁。
我正在使用.NET(无论是C#还是VB的帮助,都没关系)。我有一个控制台应用程序,基本的东西:
using System;
namespace ConsolePrinter
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Output");
Console.ReadLine();
}
}
}
在我的Winforms应用程序中,我需要重定向标准错误和标准输入,但不是标准输出。标准输出应继续显示在控制台窗口中。通过创建一个简单的Winforms项目并将上述控制台EXE作为Process对象启动,我仍然可以在召唤控制台中查看控制台的输出。一旦我重定向标准错误,输出就会从控制台窗口消失,所有显示的都是空白控制台。
以下是Winforms项目的示例:
using System;
using System.Windows.Forms;
using System.Diagnostics;
namespace winformstest2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Process proc = new Process();
proc.StartInfo.FileName = "ConsolePrinter.exe";
//proc.StartInfo.RedirectStandardError = true;
proc.StartInfo.UseShellExecute = false;
proc.Start();
}
}
}
此代码按预期工作。取消注释该注释行提供了我正在谈论的错误。
我尝试将表单附加到控制台项目,但不幸的是我需要经常显示和隐藏控制台,因此启动控制台应用程序作为一个过程是理想的。使用Win32 API也是一个想法,但用户不应该通过关闭控制台来关闭整个应用程序,AllocConsole()和其他Win32 API调用将导致它们作为其使用的副产品。
感谢任何帮助,谢谢!
答案 0 :(得分:1)
事实证明,我很难再现这一点的原因是它根本不是代码问题 - 这就是代码的运行方式。
如果您在调试器中运行该程序,由于某些原因,将RedirectStandardError
设置为true
会更改行为,如上所述。在调试器外部 - 从命令行或资源管理器启动应用程序,或在Visual Studio中通过"启动而不调试" - 输出显示为所需。
解决这个问题的最简单方法是在需要输出时无需调试。这可能很尴尬,但它可能比替代方案更简单。
另一种选择是重定向一切,并在你的WinForms应用程序中构建自己的迷你控制台,当然。这将是更整洁,更普遍的用户友好 - 没有额外的窗户突然出现 - 但更多的工作。可能值得考虑的是,这是否会成为许多人经常使用的长期应用程序,但不值得做其他事情。
答案 1 :(得分:0)
Using this solution应该有效。请注意,这是一个Winforms应用程序。
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace ConsoleExRun
{
class Program
{
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool AllocConsole();
static void Main(string[] args)
{
AllocConsole();
Process proc = new Process();
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.FileName = "ping";
proc.StartInfo.Arguments = "localhost";
proc.StartInfo.RedirectStandardError = true;
proc.StartInfo.RedirectStandardInput = true;
proc.Start();
Form f = new Form();
Application.Run(f);
}
}
}