2009-08-06 77 views
6

我创建可以运行的GUI,也可以通过命令行来操作一个C#WinForms项目。目前,我可以处理命令行输入和参数。我可以从命令行运行程序,我可以使用该程序来处理参数。但是Console.Writeline()完全没有。任何线索为什么会这样?Console.Writeline()不工作

+3

在这里看到:http://stackoverflow.com/questions/807998/how-do-i-create-ac-app-that-decides-itself-whether-to-show-as- a-console-or-wind – Thorarin 2009-08-06 19:30:06

+0

您的意思是在命令行模式下运行程序时调用Console.WriteLine似乎默默地失败了吗? – 2009-08-06 19:30:45

+0

可以尝试下面简单 - 静态无效的主要(字串[] args){ 的foreach (在args串ARG) { Console.WriteLine(ARG); } Console.ReadLine(); } 它工作吗? – Mutant 2009-08-06 19:31:46

回答

6

在大多数情况下,看到answer here。不过,我想指出是否存在FreeConsole() API调用,它允许您正常关闭控制台。

[DllImport("kernel32.dll")] 
static extern int FreeConsole() 

有一两件事我想请注意:您可能会看到出现在您的控制台输出的前一个命令提示符的一些怪事,如果你从现有的控制台启动并连接到与AttachConsole(如反对AllocConsole)。

这是一个很难解决的时间问题。如果这是一个问题,请将您的应用程序设置为像其他人所建议的控制台应用程序。直到应用程序关闭时,才会出现无命令提示符的效果,但如果您打开一个winform,则可能不是您想要的。

针对您的评论:它要么AttachConsoleAllocConsole。我链接的示例首先尝试附加到现有控制台。如果失败(很可能是因为它不存在),它会改为创建一个新的控制台窗口。

如果你找到一种方法,有两全其美的命令行的行为和GUI交互模式而言,请让我知道。我没有深入搜索解决方案,但我有一些小型应用程序会受益。顺便说一句:如果你打算在你的命令行上使用管道(例如将输出重定向到一个文件),那么不幸的是,这种方式不行。

+0

此解决方案效果很好。幸运的是,我不需要管道。谢谢!! – novacara 2009-08-06 20:00:10

0

它作为你的项目的属性应用程序选项卡上配置它与项目类型做,你有3种选择:

  • 控制台应用程序
  • Windows应用程序
  • 类库

如果使用Windows应用程序工作,但是,你也可以处理命令行参数,因为这些都是在主函数接收。

0

项目必须设置为编译到一个控制台应用程序控制台功能工作。另一方面,它将始终有一个控制台窗口,即使以GUI的形式运行。我不知道这方面的解决方法(但如果有的话可能会有兴趣听到)。

3

这是因为你已经写了一个winforms应用程序 - 这意味着System.Console.Out(即标准输出流)被设置为Stream.Null。这意味着任何对该流的调用都将失败。

您可以在命令行输入处理,因为他们来自不同的流。故事的寓意是你可以拥有一个winforms应用程序或一个命令行应用程序,但不能同时存在。

+0

是的,排序... Windows API调用救援:) – Thorarin 2009-08-06 19:55:40

5

您可以使用以下DllImports启用Windows窗体应用程序控制台:

[DllImport("kernel32.dll")] 
    static extern bool AttachConsole(int dwProcessId); 
    private const int ATTACH_PARENT_PROCESS = -1; 

    [DllImport("kernel32.dll", SetLastError = true)] 
    internal static extern int FreeConsole(); 

然后,您可以使用启用控制台:

AttachConsole(ATTACH_PARENT_PROCESS); 

,并且可以使用禁用它:

 FreeConsole(); 
2

我在一个后台线程中做了这个,后台线程正在运行一个动态加载的函数DLL(反射)

AllocConsole(); 
IntPtr stdHandle = GetStdHandle(STD_OUTPUT_HANDLE); 

StreamWriter standardOutput = new StreamWriter(Console.OpenStandardOutput()); 
standardOutput.AutoFlush = true; 
Console.SetOut(standardOutput); 
// 
//Console writing here 
// 
FreeConsole(); 

我的控制台是空白的,直到我说的Console.SetOut(),我不知道你需要调用GetStdHandle()

+0

谢谢,我有一个工作了一段时间的AllocConsole,突然间它不再有了。添加Console.SetOut()做了诡计! – 2015-07-20 18:21:41

1

您可能需要更改应用程序类型。这可以通过通过在GUI应用程序属性或者改变它来完成(如answer从ConsultUtah解释),也可以编辑.csproj文件

Winform的/ WPF:

<OutputType>WinExe</OutputType> 

控制台( 这是你需要什么console.writeline()是工作):

<OutputType>Exe</OutputType> 

DLL(包括Web应用A NS):

<OutputType>Library</OutputType>