ChatGPT解决这个技术问题 Extra ChatGPT

在 Visual Studio 中而不是控制台中具有控制台应用程序的输出

使用 Eclipse 在 Java 中执行控制台应用程序时,我看到输出被放在 IDE 本身的文本框中,而不是像在 Visual Studio 中那样弹出控制台。这很方便,因为即使在程序退出后,我仍然可以很好地利用其中写入的文本,因为在我再次运行它之前它不会被删除。是否可以使用 Visual Studio 实现类似的目标?我知道,而不是做

System.Console.WriteLine(str);

我可以

System.Diagnostics.Debug.WriteLine(str);

但它并不完全相同,因为在输出窗口中会出现很多“垃圾”,就像所有加载的符号等一样。

更好的是,当您运行应用程序时,是否可以在 IDE 本身中完成所有操作,而不是让控制台运行?

你用的是什么版本的VS?
您有测试结果窗格吗?
我从来没有注意到它。我会检查一下。我应该拥有它吗?

L
LUser

在工具 -> Visual Studio 选项对话框 -> 调试 -> 选中“将所有输出窗口文本重定向到即时窗口”。


我已经选中了这个复选框,但我仍然得到一个控制台弹出窗口,并且在“输出”窗口(调试、测试、构建……)或“立即窗口”中什么也没有。
@EvenLisle 您需要将应用程序类型更改为 Windows 应用程序,如 stolsvik's answer。在任何情况下,这个答案中提到的选项对我来说都是默认启用的。
“将所有输出窗口文本重定向到立即窗口”到底是什么意思?如果需要,请使用各种上下文。我对什么是“即时窗口”感到困惑。
@TooTone问题清楚地说明了“控制台应用程序”并将其更改为仅出于调试目的的其他内容,我什至不能 Console.ReadKey() 简直太荒谬了!
仅适用于 Debug.WriteLine(),不适用于 Console.WriteLine() :(
M
MickyD

在 Visual Studio 选项对话框 -> 调试 -> 选中“将所有输出窗口文本重定向到即时窗口”。然后转到您的项目设置并将类型从“控制台应用程序”更改为“Windows 应用程序”。此时,Visual Studio 不再打开控制台窗口,并且输出被重定向到 Visual Studio 中的输出窗口。但是,你不能做任何“创造性的”事情,比如请求键或文本输入,或者清除控制台——你会得到运行时异常。


我觉得这特别笨拙。我想知道,VS 背后的基本原理是什么?所有现代 IDE 都应该能够在 IDE 中拥有一个面板,作为输入和输出的控制台。 (抓头)
该问题清楚地说明了 "console application" 并将其更改为仅出于调试目的的其他内容,我什至不能 Console.ReadKey() 简直太荒谬了!
不知道为什么,但是当我尝试将我的应用程序的 Output type 从 Windows 应用程序恢复到控制台时,当我运行我的应用程序时,控制台窗口就看不到了。我能够调试应用程序,并且 Main 入口点也受到影响。我还恢复了这篇文章中提到的选项设置,但无济于事。我正在使用 VS 2017 社区版。 我失去了我的控制台窗口(抽泣)。
对于它的价值,在 VS 15.8.7 中,我可以让控制台应用程序的输出重定向的唯一方法是将其更改为 Windows 应用程序,并保留未选中的重定向框。如果我选中该框,它不会显示输出。
J
Joel Coehoorn

使用System.Diagnostics.Trace

根据您附加的侦听器,跟踪输出可以转到调试窗口、控制台、文件、数据库或一次全部。可能性实际上是无穷无尽的,因为实现您自己的 TraceListener 非常简单。


是的,但我想知道的是是否有可能只做它,而不必自己实现它。
@devoured Trace 类默认输出到调试窗口。如果您还想在其他地方查看输出,您只需要附加额外的侦听器(并且已经编写了几个可以使用)。
我进入调试选项对话框并选择“将所有输出窗口文本重定向到即时窗口”以使跟踪输出转到即时窗口,这样它就不会与调试废话混为一谈。
J
Jess

伙计们,是时候检查 Visual Studio 的最新版本了。以前对你们中的一些人不起作用的最推荐的解决方案现在可能会起作用。

在 Visual Studio 2017(发布版本 15.4.2 及更高版本)中,转到 Tools > Options > Debugging > General > (Check Box) Redirect all Output Window text to Immediate Window 对我有用。

几点注意事项:

要查看即时窗口,请确保您处于调试模式。现在应该有 3 个其他调试工具可供您使用,即调用堆栈、断点和命令窗口,如下所示:

https://i.stack.imgur.com/8MO6S.png

最好的祝愿!


在 v15.9.4 中测试,不起作用(至少不适用于控制台应用程序)。
唔。如果您可以共享配置的屏幕截图,我可以尝试在我的末端复制该问题。否则,如果已解决,您可以分享您的解决方案。 Visual Studio 15.9.4 的发行说明可在 docs.microsoft.com/en-us/visualstudio/releasenotes/… 上找到,根据您的环境,您可能会在那里找到一些有用的提示。 Visual Studio 2017(输出窗口)文档docs.microsoft.com/en-us/visualstudio/ide/reference/…
仔细检查您正在测试的项目是作为“控制台应用程序”创建的,而不是“Windows 应用程序”。您的方法适用于 Windows 应用程序,但这不是 OP 指定的。
这似乎不适用于 VS2022 中的控制台项目
S
Samuel Neff

您可以创建一个您运行的包装应用程序,而不是直接运行您的真实应用程序。包装应用程序可以监听标准输出并将所有内容重定向到 Trace。然后更改运行设置以启动您的包装器并传入要运行的真实应用程序的路径。

如果调试器附加到包装器,您还可以让包装器自动将调试器附加到新进程。


M
Mark A. Donohoe

一个对我有用的简单解决方案,可以使用控制台功能(ReadKey、带格式和 arg 的字符串等)并查看和保存输出:

我编写了写入 ConsoleTrace 的 TextWriter,并用它替换了 Console.Out

如果你使用 Dialog -> Debugging -> Check the "Redirect All Output Window Text to the Immediate Window" 你会在即时窗口中得到它并且非常干净。

我的代码:在我的代码开头:

Console.SetOut(new TextHelper());

和班级:

public class TextHelper : TextWriter
{
    TextWriter console;

    public TextHelper() {
        console = Console.Out;
    }

    public override Encoding Encoding => this.console.Encoding;

    public override void WriteLine(string format, params object[] arg)
    {
        string s = string.Format(format, arg);
        WriteLine(s);
    }

    public override void Write(object value)
    {
        console.Write(value);
        System.Diagnostics.Trace.Write(value);
    }

    public override void WriteLine(object value)
    {
        Write(value);
        Write("\n");
    }

    public override void WriteLine(string value)
    {
        console.WriteLine(value);
        System.Diagnostics.Trace.WriteLine(value);
    }
}

注意:我只覆盖了我需要的东西,所以如果你编写其他类型,你应该覆盖更多


H
Hemendr

您可以尝试 VSConsole,它允许您将其控制台窗口集成到 VisualStudio 中,作为底部的停靠面板。要使用它,您必须

将 VSCodeExtension 添加到 VisualStudio

在您的项目中添加 VSCode NugetPackage 引用。

添加使用 Console = VSConsole.Console;作为 *.cs 文件中的命名空间引用

将输出类型从控制台应用程序更改为 Windows 应用程序以隐藏运行控制台应用程序时弹出的主控制台窗口。

然后,您的应用程序将使用 System.Console 类的 VSConsole.Console 类。

https://i.stack.imgur.com/9kEVf.gif


j
joshmcode

我知道这只是另一个答案,但我想我会为新的 Web 开发人员写一些东西,他们可能会对“更改为 Windows 应用程序”部分感到困惑,因为我认为默认情况下 Visual Studio 2013 中的 MVC 应用程序默认为类库的输出类型。

我的 Web 应用程序默认设置为“类库”的输出类型。你不必改变它。我所要做的就是按照去工具的建议>选项>调试>将所有输出窗口文本重定向到立即窗口。然后我使用了上面 Joel Coehoorn 的 System.Diagnostics.Trace 建议。


u
uffehellum

相反,您可以在测试结果中收集输出。

您无法提供输入,但您可以轻松地提供多个具有不同命令行参数的测试,每个测试都收集输出。

如果您的目标是调试,那么这是一种提供可重复调试场景的简单方法。

namespace Commandline.Test
{
    using Microsoft.VisualStudio.TestTools.UnitTesting;

    [TestClass]
    public class CommandlineTests
    {
        [TestMethod]
        public void RunNoArguments()
        {
            Commandline.Program.Main(new string[0]);
        }
    }
}

u
user829755

关于 System.Diagnostics.Debug 在输出窗口中产生大量“垃圾”:您可以通过右键单击输出窗口来关闭它。例如,有一个项目“模块加载消息”要禁用,还有一个项目“程序输出”要保留。


G
Galina Khrychikova

你有三种可能性来做到这一点,但这并不是微不足道的。所有 IDE 的主要思想是它们都是子(调试)进程的父进程。在这种情况下,可以使用标准输入、输出和错误处理程序进行操作。因此 IDE 启动子应用程序并重定向到内部输出窗口。我知道另一种可能性,但它会在未来出现

您可以为 Visual Studio 实现自己的调试引擎。调试引擎控制应用程序的启动和调试。您可以在 docs.microsoft.com(Visual Studio 调试引擎)上找到如何执行此操作的示例,使用 c++ 的 std 处理程序的重复或使用 c# 的 Console.SetOut(TextWriter) 重定向表单应用程序。如果需要打印到输出窗口,则需要使用 Visual Studio 扩展 SDK。您可以在 Github 上找到第二个变体的示例。启动使用 System.Diagnostics.Debug.WriteLine 的应用程序(用于打印到输出),然后它将启动子应用程序。在启动孩子时,您需要使用管道将标准输出重定向到父级。你可以在 MSDN 上找到一个例子。但我认为这不是最好的方法。


M
Marcelo Scofano Diniz

如果您需要 Console.WriteLine 的输出,并且将所有输出窗口文本重定向到即时窗口不起作用,并且您需要知道集成测试资源管理器的测试输出,使用 NUnit.Framework 我们的问题已经在 VS 2017 解决:

https://i.stack.imgur.com/zGohE.png

https://i.stack.imgur.com/Yud0M.png

标准输出是我们想要的输出,由 Console.WriteLine 生成。

它适用于 VS 2017 中的控制台和 Windows 窗体应用程序,但仅适用于在调试或运行时为测试资源管理器生成的输出;无论如何,这是我对 Console.WriteLine 输出的主要需求。


H
Hemendr

如果您在 Console 上使用与 Debug class 中可用的相同方法,例如 Console.WriteLine(string),那么在 .net 核心中,您可以在 program.cs 文件中添加以下行作为您的第一行。

global using Console = System.Diagnostics.Debug;
using System.Diagnostics;

现在,您对 Console.WriteLine(string) 的所有调用都在项目中的所有 *.cs 文件中作为 Debug.WriteLine(string) 执行。在您想显式使用 Console.Readline()console 方法的地方,您必须将其替换为完全限定的类名 System.Console.ReadLine()

https://i.stack.imgur.com/UQHeW.png