在不调试模式下,在Visual Studio的输出窗口中显示一条消息?

60

在Java中,可以使用System.out.println(message)将消息打印到输出窗口。

在Visual Studio中的等效方法是什么?

我知道当我处于调试模式时,可以使用此方法在输出窗口中查看消息:

Debug.WriteLine("Debug : User_Id = "+Session["User_Id"]);
System.Diagnostics.Trace.WriteLine("Debug : User_Id = "+Session["User_Id"]);

在不使用Visual Studio调试的情况下,该如何完成这个操作?


12
学会热爱测试,避免使用调试器。使用调试器是浪费时间的行为。有更好的方法来“调试”软件,而不需要逐行评估。 - Ritch Melton
6
调试器只有在需要逐步检查复杂代码时才有用。在Web应用程序中,我们已经成功地利用它来调试多次在不同上下文中调用的相同代码;但对于简单的东西,真正正确的方法是使用简单输出。这样做更快而且更少神经质。 - user1086498
6个回答

26

结果不在输出窗口中,而在测试结果详细信息中(TestResult面板位于底部,在测试结果上右键单击并转到TestResultDetails)。

这适用于Debug.WriteLine和Console.WriteLine。


这个只适用于你的跟踪消息是从单元测试内部编写的,但如果不是,你将无法在其他地方找到它! - Bjørn van Dommelen

20

即使你不处于调试模式,跟踪消息也可以在输出窗口中出现。您只需要确保定义了TRACE编译器常量。


4
根据Frederik的建议,我找到了这篇博客文章:如何在VS中使用TRACE - spoulson

13

Trace.WriteLine方法是一种有条件编译的方法。这意味着只有在代码编译时定义了TRACE常量,它才会执行。在Visual Studio中,默认情况下,TRACE仅在DEBUG模式下定义。

右键单击项目并选择属性。转到编译选项卡。选择发布模式并将TRACE添加到已定义的预处理器常量中。这应该为您解决问题。


3
好的提示。在VS10中,它是“生成”选项卡,在那里现在有一个名为“定义TRACE常量”的复选框。 - DanM7

8
这整个线程让我感到困惑,直到我意识到你必须运行调试器才能看到任何跟踪或调试输出。我需要一个调试输出(在调试器之外),因为我的WebApp在调试时运行良好,但在没有运行调试器时却没有运行良好(当通过调试器运行时SqlDataSource被正确实例化)。
仅仅因为在发布模式下可以看到调试输出并不意味着如果你没有运行调试器就会看到任何东西。仔细阅读Writing to output window of Visual Studio?使我发现了DebugView作为一种替代方法。非常有用!
希望这能帮助任何其他被这个问题困扰的人。

1
我使用 IVsOutputWindowIVsOutputWindowPane 来在 Visual Studio 输出窗口中编写。我将它们作为成员包含在我的 OutputWindow 类中,代码如下:
public class OutputWindow : TextWriter
{
  #region Members

  private static readonly Guid mPaneGuid = new Guid("AB9F45E4-2001-4197-BAF5-4B165222AF29");
  private static IVsOutputWindow mOutputWindow = null;
  private static IVsOutputWindowPane mOutputPane = null;

  #endregion

  #region Constructor

  public OutputWindow(DTE2 aDte)
  {
    if( null == mOutputWindow )
    {
      IServiceProvider serviceProvider = 
      new ServiceProvider(aDte as Microsoft.VisualStudio.OLE.Interop.IServiceProvider);
      mOutputWindow = serviceProvider.GetService(typeof(SVsOutputWindow)) as IVsOutputWindow;
    }

    if (null == mOutputPane)
    {
      Guid generalPaneGuid = mPaneGuid;
      mOutputWindow.GetPane(ref generalPaneGuid, out IVsOutputWindowPane pane);

      if ( null == pane)
      {
        mOutputWindow.CreatePane(ref generalPaneGuid, "Your output window name", 0, 1);
        mOutputWindow.GetPane(ref generalPaneGuid, out pane);
      }
      mOutputPane = pane;
    }
  }

  #endregion

  #region Properties

  public override Encoding Encoding => System.Text.Encoding.Default;

  #endregion

  #region Public Methods

  public override void Write(string aMessage) => mOutputPane.OutputString($"{aMessage}\n");

  public override void Write(char aCharacter) => mOutputPane.OutputString(aCharacter.ToString());

  public void Show(DTE2 aDte)
  {
    mOutputPane.Activate();
    aDte.ExecuteCommand("View.Output", string.Empty);
  }

  public void Clear() => mOutputPane.Clear();

  #endregion
}

如果您需要在输出窗口中写入大量文本,通常不希望冻结用户界面。为此,您可以使用Dispatcher。使用此实现在输出窗口中编写内容时,您只需执行以下操作即可:
Dispatcher mDispatcher = HwndSource.FromHwnd((IntPtr)mDte.MainWindow.HWnd).RootVisual.Dispatcher;

using (OutputWindow outputWindow = new OutputWindow(mDte))
{
  mDispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() =>
  {
    outputWindow.Write("Write what you want here");
  }));
}

你有完整的实现代码可以分享吗?在这段代码片段中没有得到mDte对象初始化的详细信息。 - Anto Varghese

1

对我来说,这个事实是debug.writeline在Immediate窗口中显示,而不是Output。我的VS2013安装默认甚至没有显示打开Immediate窗口的选项,所以你需要执行以下操作:

Select Tools -> Customize 
Commands Tab
View | Other Windows menu bar dropdown
Add Command...
The Immediate option is in the Debug section.

一旦您确认了这一点,就可以转到“查看”->“其他窗口”,然后选择“立即窗口”,嘿,所有的调试输出都可以被看到。
不幸的是,对我来说,它也显示了我在项目中没有意识到的大约50个错误...也许我应该再次关闭它 :-)

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