繁体   English   中英

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

[英]Console application closes immediately after opening in visual studio

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

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

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

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

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

在此处输入图像描述

让我们修复它。 当控制台应用程序从桌面、Windows 资源管理器或 Visual Studio 上的快捷方式启动时,您想要做的是提示用户按任意键。 但不是从运行其自己的控制台的命令处理器启动时。 你可以用一个小的 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);
}

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

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

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

所以,根据这里

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM