C# &引用;按任意键继续……”;“中显示的消息”;“不调试启动”;模式
我在Visual Studio中创建了一个空白的C#控制台应用程序,如下所示:C# &引用;按任意键继续……”;“中显示的消息”;“不调试启动”;模式,c#,visual-studio,visual-studio-2017,console-application,C#,Visual Studio,Visual Studio 2017,Console Application,我在Visual Studio中创建了一个空白的C#控制台应用程序,如下所示: using System; namespace ConsoleApplication1 { class Solution { static void Main(string[] args) { Console.ReadLine(); } } } 当我按F5使用默认的开始调试选项时,程序会按预期正常运行。我按下回车键,程
using System;
namespace ConsoleApplication1
{
class Solution
{
static void Main(string[] args)
{
Console.ReadLine();
}
}
}
当我按F5使用默认的开始调试选项时,程序会按预期正常运行。我按下回车键,程序结束
但当我按Ctrl+F5使用Start Without debug
选项时,按下Enter键后,控制台上会显示一条额外消息:
按任意键继续
然后我必须按键盘上的另一个键来终止程序。这条神奇的消息来自哪里?为什么它只显示在Start而不调试选项中
注意:项目的生成后事件命令行完全为空。这就是visual studio不在调试模式下运行控制台程序的方式。据我所知,这是无法控制的。因为它显示它实际上是一个cmd.exe实例,而不仅仅是一个控制台窗口,所以我假设VS在命令行上使用了/K标志(我原以为它使用的是批处理文件,但现在看来没有必要这样做)
这是针对控制台程序运行并简单退出的典型情况而做的,如果没有该消息,这样的程序将不会有机会看到输出。我能够验证@SoronelHaetir在回答中共享的信息。我在这里通过一些屏幕截图详细说明了这一点,这些截图将补充他的文章中的信息,并帮助您更好地理解这一点:
当我通过按F5使用默认的开始调试
选项运行应用程序时,我们可以在任务管理器中看到启动应用程序的可执行文件:
当我右键单击任务并从关联菜单中选择“转到进程”
选项时,我将进入进程选项卡上的一个进程,该进程具有图像名称ConsoleApp1.exe*32
,如下所示。这很有道理
现在,当我通过按Ctrl+F5使用启动而不调试
选项运行应用程序时,看不到任务管理器中启动的应用程序的可执行文件。事实上,我们看到正在启动cmd.exe
,如下所示:
现在,当我右键单击cmd.exe
任务并从上下文菜单中选择转到进程
选项时,我被带到进程选项卡上的一个进程,该进程的图像名为cmd.exe*32
,如下所示。但还有更多。您还可以看到进程选项卡中运行的ConsoleApp1.exe*32
,该选项卡在应用程序
选项卡中不可见
这就是所有点连接的方式,在启动而不调试
模式下,Visual Studio实际上启动了一个cmd.exe
实例,该实例反过来启动我们的应用程序ConsoleApp1.exe
当我按enter键时,ConsoleApp1.exe
进程终止,但cmd.exe
进程继续运行,直到我按另一个键,如下所示:
using System;
namespace ConsoleApplication1
{
class Solution
{
static void Main(string[] args)
{
Console.ReadLine();
}
}
}
是的,启动“包装”可执行文件的cmd.exe
如下所示:C:\Windows\system32\cmd.exe“/C”“[your.exe]”和pause“
,您可以使用Process Explorer之类的工具自行验证,该工具可以显示启动程序时使用的命令行。在cmd中,一个符号和无条件地将两个命令链接在一个命令行上。在调试模式下也会发生这种情况。