2016-09-21 43 views
0

只是一个简要的说明,这个问题已被重新编辑为更加简洁。在Winforms项目上没有控制台输出,在控制台项目上工作

我正在使用.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调用作为其使用的双重产品引起。

任何帮助表示赞赏,谢谢!

+1

目前还不清楚发生了什么 - 当您启动命令行应用程序时,是否会启动*与控制台窗口*?这肯定会有帮助,有一个[mcve](控制台应用程序和一个小型的WinForms应用程序 - 它只需要一个带按钮的窗口来启动控制台应用程序...) –

+0

这是http:// stackoverflow .COM /问题/ 4362111 /怎么办 - 我秀 - 一个控制台输出窗口-IN-A-形式的应用程序。虽然你必须将代码转换为vb.net – FloatingKiwi

+0

@JonSkeet这是一个输出到stdout的C++程序,没什么特别的。在控制台项目中,它直接输出到.net控制台窗口,Winforms会打开控制台但不输出任何内容。 – KingDan

回答

1

事实证明,我之所以有一个很难再现,这是,这是不是一个代码问题都没有 - 这是怎样的代码是正在运行。

如果您在调试器中运行该程序,出于某种原因将RedirectStandardError设置为true会改变行为,如上所述。在调试器外部 - 通过命令行或资源管理器启动应用程序,或者通过“无需调试即可启动”在Visual Studio中启动 - 应用程序会根据需要显示输出。

解决这个问题最简单的方法就是在需要输出时无需调试即可存活。这可能很尴尬,但它可能比替代品更简单。

另一种选择是在WinForms应用程序中重定向所有内容并构建自己的迷你控制台。这将是更整洁,更普遍的用户友好 - 没有额外的窗口弹出各地 - 但更多的工作。可能值得考虑的是,如果这将成为许多人经常使用的长期应用程序,但不值得做其他事情。

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); 
     } 
    } 
} 
+0

没有必要为* this *进程分配一个控制台。 –

+0

我会给你打个招呼,但我已经通过这个解决方案。关闭控制台关闭整个程序,所以我可能只是做一个控制台项目并附上表单。 – KingDan

+0

@JonSkeet - 从我的代码中不清楚,但这是一个winforms应用程序。对AllocConsole的调用允许stdout显示在控制台窗口中。我修改了这个例子,使其更加明显 – FloatingKiwi