在Visual Studio中打开控制台应用程序后立即关闭

4
我正在尝试在使用C#编写的Visual Studio中打开控制台应用程序,但是当我打开它时,它会立即关闭。
我知道Windows将此设置为默认安全选项(至少我这样认为)。我该怎么解决?
我知道我可以编译它并创建一个快捷方式,并修改目标,使其包含命令提示符的位置,然后才是应用程序的位置。但是创建者已经将信息生成到Visual Studio的输出中,所以只能在其中打开它,这一点非常重要。
这种情况不仅发生在Visual Studio中,而且在大多数应用程序中都会发生,但在这种情况下我需要在VS 2010中打开它。我使用的是Windows 7。
5个回答

18

这是一个古老的问题,已经启发了许多有趣的卡通:

enter image description here

我们来解决一下。你想要做的是,在从桌面快捷方式、Windows资源管理器或Visual Studio启动控制台应用程序时提示用户按任意键,但在从命令处理器运行自己的控制台时不提示。你可以通过一些P/Invoke操作实现,可以像这样找出进程是否是控制台窗口的唯一所有者:

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”的方式更麻烦。 - Sam Axe
那只是你的观点,这是一段复制/粘贴的代码,旨在永远不会成为麻烦。请随意在您自己的帖子中表达您的偏好。 - Hans Passant

9

您也可以通过按下 (Ctrl + F5) 来运行应用程序.. 这将允许它以'发布'模式运行,默认情况下,您需要按 '回车' 键才能关闭窗口。


2
尝试在Main()方法末尾添加Console.ReadKey();。这是一种快速而不太优雅的方式,可以防止窗口自动关闭。

2

您需要等待用户输入。使用 Console.ReadLine(), Console.Read(), 或者 Console.ReadKey() 中的任意一个方法。


1

因此,根据这里的说明:

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

如果我们将代码改为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);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接