Winforms项目上没有控制台输出,适用于Console项目

时间:2016-09-21 16:00:31

标签: c# .net vb.net winforms console

仅仅是一个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调用将导致它们作为其使用的副产品。

感谢任何帮助,谢谢!

2 个答案:

答案 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);
        }
    }
}