非调试模式时在 Visual Studio 的输出窗口中显示消息?

Posted

技术标签:

【中文标题】非调试模式时在 Visual Studio 的输出窗口中显示消息?【英文标题】:Display a message in Visual Studio's output window when not debug mode? 【发布时间】:2010-10-08 10:26:57 【问题描述】:

在 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 中进行调试,如何做到这一点?

【问题讨论】:

-1 - 学会热爱测试并避免使用调试器。使用调试器是一个时间槽。有更好的方法来“调试”不涉及逐行评估的软件。 调试器仅在您需要单步执行复杂代码时才有用。我们在 Web 应用程序中很好地利用了它,在这些应用程序中,相同的代码在不同的上下文中被多次调用;但对于更简单的东西,真正正确的方法是简单的输出。它更快,更不神经质。 【参考方案1】:

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

【讨论】:

按照 Frederik 的建议,我找到了这篇博文:How To Use TRACE In VS【参考方案2】:

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

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

【讨论】:

好提示。在VS10中,它是Build选项卡,现在有一个“Define TRACE constant”复选框。【参考方案3】:

结果不在输出窗口中,而是在测试结果详细信息中(底部的测试结果窗格,右键单击测试结果并转到测试结果详细信息)。

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

【讨论】:

这个!仅适用于您的跟踪消息是从单元测试内部编写的,但如果是,您将无法在其他地方找到它!【参考方案4】:

整个线程把我搞糊涂了,直到我意识到你必须运行调试器才能看到任何跟踪或调试输出。我需要一个调试输出(在调试器之外),因为我的 WebApp 在我调试时运行良好,但在调试器未运行时(通过调试器运行时正确实例化了 SqlDataSource)。

仅仅因为在发布模式下运行时可以看到调试输出意味着如果您不运行调试器,您将看到任何内容。仔细阅读Writing to output window of Visual Studio? 给了我DebugView 作为替代方案。 非常有用!

希望这可以帮助其他对此感到困惑的人。

【讨论】:

【参考方案5】:

对我来说,这是 debug.writeline 显示在即时窗口中的事实,而不是输出。我默认安装的 VS2013 甚至没有显示打开立即窗口的选项,所以你必须执行以下操作:

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

确定后,您可以转到查看 -> 其他窗口并选择即时窗口,然后就可以看到所有调试输出了。

不幸的是,它还显示了大约 50 个我在项目中不知道的错误...也许我会再次将其关闭 :-)

【讨论】:

【参考方案6】:

为了在 Visual Studio 输出窗口中写入,我使用了 IVsOutputWindowIVsOutputWindowPane。我作为成员加入了我的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

如果您要在输出窗口中写入大文本,您通常不想冻结 UI。为此,您可以使用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");
  ));

【讨论】:

你有完整的实现代码要分享吗?未在 sn-p 中获取 mDte 对象初始化详细信息。

以上是关于非调试模式时在 Visual Studio 的输出窗口中显示消息?的主要内容,如果未能解决你的问题,请参考以下文章

在运行 XNA 游戏时在 Visual Studio 中观看控制台输出面板

如何在没有Javascript调试的情况下在网站启动时在Visual Studio中启动新的Chrome实例?

Visual Studio 在调试模式下禁用 TRACE

Visual Studio 2010 认为它处于调试模式(但它设置为发布模式)

在 Visual Studio C++ 中,内存分配表示形式是啥?

使用 Visual Studio 2013 时在 Opencv 2.4.10 中加载文件时出错