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

C# 控制台应用程序在visual studio中打开后立即关闭,c#,windows,visual-studio-2010,windows-7,console,C#,Windows,Visual Studio 2010,Windows 7,Console,我正在尝试在visual studio中打开一个内置C#的控制台应用程序。我一打开它,它就会立即关闭 我知道windows设置这是一个安全默认设置(至少我认为)。我该如何解决这个问题 我知道我可以编译它,创建快捷方式,修改目标,使其在应用程序位置之前包含命令提示符的位置。虽然创建此文件的程序员将其生成信息到VisualStudio的输出中,但我必须只在那里打开它 它发生在大多数应用程序中,而不仅仅是在VisualStudio中,就在这种情况下,我需要它在VS2010中打开。我正在使用Window

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

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

我知道我可以编译它,创建快捷方式,修改目标,使其在应用程序位置之前包含命令提示符的位置。虽然创建此文件的程序员将其生成信息到VisualStudio的输出中,但我必须只在那里打开它


它发生在大多数应用程序中,而不仅仅是在VisualStudio中,就在这种情况下,我需要它在VS2010中打开。我正在使用Windows 7。

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

您需要等待用户输入。使用
Console.ReadLine()
Console.Read()
,或
Console.ReadKey()
,也可以按(Ctrl+F5)运行应用程序。。这将允许它在“释放”模式下运行,默认情况下,您需要按“返回”关闭窗口。

这是一个古老的问题,并激发了一些有趣的动画:

让我们把它修好。当从桌面、Windows资源管理器或Visual Studio上的快捷方式启动console应用程序时,您要做的是提示用户按任意键。但当它从运行自己控制台的命令处理器启动时就不是了。您可以使用一个小pinvoke来执行此操作,您可以发现进程是否是console窗口的唯一所有者,如下所示:

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);
}
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);
    }
}
使用系统;
班级计划{
静态void Main(字符串[]参数){
Console.WriteLine(“正在处理它…”);
//...
控制台。写入线(“完成”);
按任意键();
}
私有静态无效按任意键(){
if(GetConsoleProcessList(new int[2],2)So,根据

如果您的进程是唯一连接到控制台的进程,则 当进程退出时,控制台将被销毁 进程连接到控制台,然后控制台将继续 存在(因为您的程序不会是最后一个)

如果我们将代码改编成C#你会得到这样的结果:

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);
}
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);
    }
}

如果你只想在VS运行结束时快速暂停,那么pinvoke可能比记住“Debugger.IsAttached”更麻烦。这只是你的观点,这是一个复制/粘贴代码,永远不会成为麻烦。请在你自己的帖子中随意显示你的偏好。