在Visual Studio 2010中如何查看控制台输出?

164

我正在编写一个简单的C#程序,并输出一些内容(Console.WriteLine("...");)。问题是,每次运行程序时,我都无法在输出窗口中看到程序的输出。

“程序输出”标签已经被勾选,我已经将所有输出重定向到中间窗口,但仍然无效。

如何才能查看程序的输出?

我不认为问题出在我的代码上。我尝试运行一个仅输出字符串和 readline "ala hello world" 的简单程序,仍然无法看到任何输出。问题可能是我在错误的位置寻找输出或者是Visual Studio有问题。

Debug.Write 方法也不起作用。

使用 Debug.Write,现在一切正常了,虽然以前没这样过。可能之前出现了一些问题,我重启了一下电脑,现在一切都好了。谢谢大家给出的帮助性评论=)


7
Visual Studio 正覆盖了你的控制台窗口。将它移动到另一个显示器上。 - Hans Passant
10个回答

196

10
System.Diagnostics.Debug.Write(如果OP没有命名空间) - jonsca
4
没错,我只是太习惯按控制键和句号了 :) - Richard Adnams
2
如果您的应用程序是控制台应用程序,您可以使用console.writeline来打印到控制台窗口,或者如果您的应用程序是Windows窗体应用程序,则可以使用debug.write。请查看此链接以获取更多信息http://social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/701e02cc-ad77-46b9-b4fc-410bb3ff7a0d - Richard Adnams
1
有趣,我不知道那个。是的,我的应用程序是一个 Windows Form 应用程序,但是我尝试使用 debug.Write 方法后仍然出现了同样的问题。它可以编译,一切都很顺利,但我无法在任何地方看到输出。 - r3x
我遇到了“错误:未定义标识符“System””。 - CodyBugstein
显示剩余2条评论

51

以下是需要检查的几个事项:

  1. 对于console.Write/WriteLine,你的应用程序必须是控制台应用程序(在Solution Explorer中右键单击项目,选择属性,并查看应用程序选项卡中的输出类型 -- 应该是控制台应用程序(请注意,如果您真的需要Windows应用程序或类库,请不要将其更改为控制台应用程序以获取 Console.WriteLine )。

  2. 你可以使用System.Diagnostics.Debug.WriteLine来写入输出窗口(在VS中显示输出窗口,转到 视图| 输出)。请注意,在定义了DEBUG条件的构建中才会发生这些写入操作(默认情况下,调试构建定义此条件,而发布构建不定义)。

  3. 如果要能够在非调试构建中写入可配置的“侦听器”,则可以使用System.Diagnostics.Trace.Writeline。(默认情况下,这将像Debug.Writeline一样写入Visual Studio的输出窗口中)


2
我没有看到我的输出,但后来意识到我必须在调试模式下运行程序(F5),而不是Ctrl + Shift + F5。谢谢! - Travis Heeter
System.Diagnostics.Trace.Writeline似乎无法工作,我需要配置其他什么吗? - Travis Heeter
1
「1」- 是错误的陈述。Mono 对所有应用程序都能正常显示输出。「2」- 当然,问题在于该方法也没有将输出发送到终端。因此,在没有集成开发环境的情况下,无法在 PC 上调试应用程序。 - Hi-Angel

34

在你的程序结尾处添加一个 Console.Read();,这样它就不会立即关闭,你可以通过这种方式查看它的输出。

这是一个控制台应用程序,经过处理后停止但是未退出:

class Program
{
    static void Main(string[] args)
    {
        DummyObjectList dol = new DummyObjectList(2);
        dol.Add(new DummyObject("test1", (Decimal)25.36));
        dol.Add(new DummyObject("test2", (Decimal)0.698));
        XmlSerializer dolxs = new XmlSerializer(typeof(DummyObjectList));
        dolxs.Serialize(Console.Out, dol);

        Console.WriteLine(string.Empty);
        Console.WriteLine(string.Empty);

        List<DummyObject> dolist = new List<DummyObject>(2);
        dolist.Add(new DummyObject("test1", (Decimal)25.36));
        dolist.Add(new DummyObject("test2", (Decimal)0.698));
        XmlSerializer dolistxs = new XmlSerializer(typeof(List<DummyObject>));
        dolistxs.Serialize(Console.Out, dolist);
        Console.Read(); //  <--- Right here
    }
}

或者,你可以在最后一行上添加一个断点。


2
Console.ReadLine同样有效,只需按Enter键即可继续,而Read则接受任何标准键。 - Richard Adnams
这是一个Windows窗体应用程序,但Debug.Write和Console.WriteLine方法似乎都无法工作。 - r3x
嗯,为什么你从Windows Form应用中输出到控制台呢?我建议在一个表单或对话框上输出。或者可以做一个控制台应用程序... - Vincent Vancalbergh
是的,我早就被指出来了,这只是我的一个愚蠢错误,仍然感谢你让我知道 =) - r3x
Console.Read()会导致控制台窗口获得焦点,因此出现在VS前面。如果你只是在Console.Write()之后放置一个断点,控制台窗口将显示你的输出,但没有焦点,可能不可见。 - Nigel

21

按下 Ctrl + F5 以运行程序,而不是使用 F5


2
按下 Ctrl + F5 键可以启动应用程序,但不会进行调试,因此您在输出窗口中看不到任何内容。 - Richard Adnams
6
这对我有帮助;我只想看看程序输出了什么,但是没有任何控制台输出出现。这导致程序在运行后保持控制台窗口打开,以便我可以查看输出。 - davenpcj
+1,如果您实际上不想调试(显示控制台并允许读取输出),那么这就是一个好选择。 - mlvljr

8

System.Diagnostics.Debug.WriteLine() 可以使用,但您必须在正确的位置查看输出。在Visual Studio 2010中,在菜单栏上,点击 调试 -> 窗口 -> 输出。现在,在屏幕底部与错误列表并排停靠的地方,应该有一个输出选项卡。单击它,并检查下拉列表中是否显示来自调试流的输出。

P.S .:我认为输出窗口在新安装时会显示,但我记不清了。如果没有显示,或者您不小心关闭了它,请按照以下说明操作。


0

我经常遇到这个问题,但我不明白为什么没有人提到这个解决方案:

点击 查看输出(或者按住 Ctrl 并按下 W > O)

控制台输出将出现在您的 错误列表本地变量监视 窗口所在的位置。

注意:我正在使用 Visual Studio 2015。


你提到的“Output”窗口看起来是由调试器生成的,因为它有很多关于程序集加载、线程启动和停止等方面的信息。这与控制台输出不同。 - PeterVermont

0

为了保持打开Windows控制台并且不使用标准输出流cout以外的其他输出方法,请前往您的项目名称 -> 属性 -> 链接器 -> 系统。

在这里,选择子系统选项卡并标记控制台 (/SUBSYSTEM:CONSOLE)。完成后,每当您想要编译时,请使用Ctrl + F5 (启动而不进行调试),您的控制台将保持打开状态。 :)


我认为这适用于C++,而不是问题中的C#。 - Dmitry Fedorkov

0

Visual Studio 本身覆盖了控制台窗口,请尝试最小化 Visual Studio 窗口,它们会相互重叠。


-1
在 Program.cs 文件中,在下面这段代码之间:
static int Main(string[] agrs)
{

在你的代码中,添加以下内容:

#if DEBUG
    int rtn = Main2(args);
    Console.WriteLine("return " + rtn);
    Console.WriteLine("ENTER to continue.");
    Console.Read();
    return rtn;
}

static int Main2(string[] args)
{
#endif

请添加一个描述,说明您的代码如何解决问题。 - Koopakiller

-4
你可以创建两个小方法,一个在程序开始时调用,另一个在结束时调用。你也可以使用Console.Read(),这样程序在最后一行写入后不会关闭。
这样你就可以确定功能何时被执行,以及程序何时退出。
startProgram()
{
     Console.WriteLine("-------Program starts--------");
     Console.Read();
}


endProgram()
{
    Console.WriteLine("-------Program Ends--------");
    Console.Read();
}

我不认为这个答案提供了新的信息,因为Console.Read()的可能性已经在之前被提到过了。 - ForceMagic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接