C# 控制台应用程序在visual studio中打开后立即关闭
我正在尝试在visual studio中打开一个内置C#的控制台应用程序。我一打开它,它就会立即关闭 我知道windows设置这是一个安全默认设置(至少我认为)。我该如何解决这个问题 我知道我可以编译它,创建快捷方式,修改目标,使其在应用程序位置之前包含命令提示符的位置。虽然创建此文件的程序员将其生成信息到VisualStudio的输出中,但我必须只在那里打开它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
它发生在大多数应用程序中,而不仅仅是在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”更麻烦。这只是你的观点,这是一个复制/粘贴代码,永远不会成为麻烦。请在你自己的帖子中随意显示你的偏好。