【问题标题】:Console.Writeline() not workingConsole.Writeline() 不工作
【发布时间】:2009-08-06 19:27:16
【问题描述】:

我正在创建一个可以作为 GUI 运行或可以从命令行操作的 c# winforms 项目。目前,我可以处理命令行输入和参数。我可以从命令行运行程序,并且可以使用该程序来处理参数。但是 Console.Writeline() 绝对什么都不做。任何线索为什么会这样?

【问题讨论】:

  • 您的意思是在命令行模式下运行程序时调用 Console.WriteLine 似乎会静默失败?
  • 你可以试试下面简单的 - static void Main(string[] args) { foreach(string arg in args) { Console.WriteLine(arg); } Console.ReadLine();它有效吗?
  • 感谢 Thorarin,这可能正是我想要的。所以我猜即使命令行可以运行我的 GUI App 程序......为了写出或与之交互我必须创建一个新的命令行并附加它?对吗?
  • 致其他人:我需要程序作为 GUI 或命令行运行。因此,在这种情况下更改项目设置将无济于事。

标签: c# command-line console


【解决方案1】:

在大多数情况下,请参阅answer here。但是,我想指出FreeConsole() API 调用的存在,它允许您优雅地关闭控制台。

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

我要注意的一件事:如果您从现有控制台启动并使用 AttachConsole AllocConsole)。

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

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

如果您找到一种在命令行行为和 GUI 交互模式方面两全其美的方法,请告诉我。我没有对解决方案进行任何深入的搜索,但我有一些小应用程序会从中受益。

顺便说一句:如果您打算在命令行上使用 管道(例如,将输出重定向到文件),那么不幸的是,这不会像这样工作。

【讨论】:

  • 这个解决方案效果很好。幸运的是我不需要管道。谢谢!!
【解决方案2】:

您可以使用以下 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();

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 是的,有点... Windows API 调用救援 :)
    • 这个答案应该被删除,因为陈述不准确:“这个故事的寓意是你可以拥有一个 winforms 应用程序或一个命令行应用程序,但不能同时拥有两者。” gls123 反驳了它。
    【解决方案4】:

    我在后台线程中执行此操作,该线程从动态加载的 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()

    【讨论】:

    • 谢谢,我有一个 AllocConsole 工作了一段时间,但突然就不行了。添加 Console.SetOut() 就可以了!
    • 哇,有很多关于如何解决这个问题的答案。在我回顾了过去的十几个之后,你的工作有效。我正在使用 kernel32“attachconsole”。需要新的流写入器、自动刷新为 true 和 SetOut。
    【解决方案5】:

    您可能需要更改应用程序类型。这可以通过 GUI 中的应用程序属性更改它来完成(如 ConsultUtah 的 answer 中所述),或者您可以编辑 .csproj 文件

    Winform/WPF:

    <OutputType>WinExe</OutputType>
    

    控制台(这是 console.writeline() 工作所需要的):

    <OutputType>Exe</OutputType>
    

    Dll(包括网络应用程序):

    <OutputType>Library</OutputType>
    

    【讨论】:

      【解决方案6】:

      它与项目类型有关,因为您在项目属性的应用选项卡上配置它,您有 3 个选项:

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

      但是,如果您使用 Win 应用程序,您也可以处理命令行参数,因为这些是在 Main 函数中接收的。

      【讨论】:

        【解决方案7】:

        必须将项目设置为编译为控制台应用程序才能使控制台功能正常工作。另一方面,它总是有一个控制台窗口,即使作为 GUI 运行也是如此。我不知道有什么解决方法(但如果有的话,我很想知道它)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-05-16
          • 1970-01-01
          • 2017-07-08
          • 1970-01-01
          • 2020-11-24
          • 1970-01-01
          • 2020-01-05
          • 1970-01-01
          相关资源
          最近更新 更多