【问题标题】:Console application closes immediately after opening in visual studio控制台应用程序在 Visual Studio 中打开后立即关闭
【发布时间】:2012-10-26 16:32:31
【问题描述】:

我正在尝试在用 C# 构建的 Visual Studio 中打开一个控制台应用程序。我一打开它就立即关闭。

我知道 Windows 设置这是一个安全默认值(至少我认为)。我该如何解决?

我知道我可以编译它并创建快捷方式并修改目标,使其在应用程序位置之前具有命令提示符的位置。虽然创建它的程序员已经让它生成信息到 Visual Studio 的输出中,所以我必须只在那里打开它。

大多数应用程序都会发生这种情况,而不仅仅是在 Visual Studio 中,只是在这种情况下,我需要在 VS 2010 中打开它。我使用的是 Windows 7。

【问题讨论】:

    标签: c# windows visual-studio-2010 windows-7 console


    【解决方案1】:

    这是一个古老的问题,并启发了几部有趣的漫画:

    让我们修复它。您要做的是在从桌面、Windows 资源管理器或 Visual Studio 上的快捷方式启动控制台应用程序时提示用户按 Any 键。但不是当它从运行自己的控制台的命令处理器启动时。您可以通过一点点 pinvoke 来执行此操作,您可以确定该进程是否是控制台窗口的唯一所有者,如下所示:

    using System;
    
    class Program {
        static void Main(string[] args) {
            Console.WriteLine("Working on it...");
            //...
            Console.WriteLine("Done");
            PressAnyKey();
        }
    
        private static void PressAnyKey() {
            if (GetConsoleProcessList(new int[2], 2) <= 1) {
                Console.Write("Press any key to continue");
                Console.ReadKey();
            }
        }
    
        [System.Runtime.InteropServices.DllImport("kernel32.dll")]
        private static extern int GetConsoleProcessList(int[] buffer, int size);
    }
    

    【讨论】:

    • 如果所有人都想要一种在 VS 运行结束时暂停的快速方法,那就不行了。对于小型实用程序或测试代码,pinvoke 可能比记住“Debugger.IsAttached”更麻烦。
    • 这只是您的意见,这是编写的复制/粘贴代码,绝不是麻烦。请随时在您自己的帖子中表明您的偏好。
    【解决方案2】:

    您也可以按 (Ctrl + F5) .. 运行应用程序。这将允许它以“释放”模式运行,默认情况下,您需要按“返回”关闭窗口。

    【讨论】:

      【解决方案3】:

      尝试在 Main() 方法的末尾添加Console.ReadKey();。这是阻止窗口自行关闭的一种快速而肮脏的方法。

      【讨论】:

        【解决方案4】:

        您需要等待用户输入。使用Console.ReadLine()Console.Read()Console.ReadKey()

        【讨论】:

          【解决方案5】:

          所以,根据here

          如果您的进程是唯一连接到控制台的进程,那么 当您的进程退出时,控制台将被销毁。如果还有其他 进程附加到控制台,然后控制台将继续 存在(因为你的程序不会是最后一个)。

          如果我们将代码改编为 C#,您最终会得到这样的结果:

          using System;
          using System.Runtime.InteropServices;
          
          namespace CheckIfConsoleWillBeDestroyedAtTheEnd
          {
              internal class Program
              {
                  private static void Main(string[] args)
                  {
                      // ...
          
                      if (ConsoleWillBeDestroyedAtTheEnd())
                      {
                          Console.WriteLine("Press any key to continue . . .");
                          Console.ReadKey();
                      }
                  }
          
                  private static bool ConsoleWillBeDestroyedAtTheEnd()
                  {
                      var processList = new uint[1];
                      var processCount = GetConsoleProcessList(processList, 1);
          
                      return processCount == 1;
                  }
          
                  [DllImport("kernel32.dll", SetLastError = true)]
                  static extern uint GetConsoleProcessList(uint[] processList, uint processCount);
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-11-18
            • 2012-09-13
            • 2012-08-06
            • 1970-01-01
            • 2016-10-20
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多