4

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

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

我知道我可以编译它并创建一个快捷方式并修改目标,使其在应用程序位置之前具有命令提示符的位置。尽管创建此程序的程序员已将其生成信息到 Visual Studio 的输出中,但我必须只在此处打开它。

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

4

5 回答 5

18

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

在此处输入图像描述

让我们修复它。您要做的是在从桌面、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);
}
于 2012-11-06T17:40:13.430 回答
9

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

于 2012-11-06T17:11:43.273 回答
2

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

于 2012-11-06T17:03:47.943 回答
2

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

于 2012-11-06T17:04:47.777 回答
0

所以,根据这里

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

如果我们将代码改编为 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);
    }
}
于 2020-07-28T13:43:21.590 回答