簡體   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