Display a message in Visual Studio's output window when not debug mode?

后端 未结 6 1958
耶瑟儿~
耶瑟儿~ 2021-01-31 13:50

In Java, you can use System.out.println(message) to print a message to the output window.

What\'s the equivalent in Visual Studio ?

I know when I\'m

相关标签:
6条回答
  • 2021-01-31 14:14

    For me this was the fact that debug.writeline shows in the Immediate window, not the Output. My installation of VS2013 by default doesn't even show an option to open the Immediate window, so you have to do the following:

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

    Once you have Ok'd that, you can go to View -> Other Windows and select the Immediate Window and hey presto all of the debug output can be seen.

    Unfortunately for me it also showed about 50 errors that I wasn't aware of in my project... maybe I'll just turn it off again :-)

    0 讨论(0)
  • 2021-01-31 14:16

    The Trace messages can occur in the output window as well, even if you're not in debug mode. You just have to make sure the the TRACE compiler constant is defined.

    0 讨论(0)
  • 2021-01-31 14:24

    The results are not in the Output window but in the Test Results Detail (TestResult Pane at the bottom, right click on on Test Results and go to TestResultDetails).

    This works with Debug.WriteLine and Console.WriteLine.

    0 讨论(0)
  • 2021-01-31 14:25

    This whole thread confused the h#$l out of me until I realized you have to be running the debugger to see ANY trace or debug output. I needed a debug output (outside of the debugger) because my WebApp runs fine when I debug it but not when the debugger isn't running (SqlDataSource is instantiated correctly when running through the debugger).

    Just because debug output can be seen when you're running in release mode doesn't mean you'll see anything if you're not running the debugger. Careful reading of Writing to output window of Visual Studio? gave me DebugView as an alternative. Extremely useful!

    Hopefully this helps anyone else confused by this.

    0 讨论(0)
  • 2021-01-31 14:28

    The Trace.WriteLine method is a conditionally compiled method. That means that it will only be executed if the TRACE constant is defined when the code is compiled. By default in Visual Studio, TRACE is only defined in DEBUG mode.

    Right Click on the Project and Select Properties. Go to the Compile tab. Select Release mode and add TRACE to the defined preprocessor constants. That should fix the issue for you.

    0 讨论(0)
  • 2021-01-31 14:37

    To write in the Visual Studio output window I used IVsOutputWindow and IVsOutputWindowPane. I included as members in my OutputWindow class which look like this :

    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
    }
    

    If you have a big text to write in output window you usually don't want to freeze the UI. In this purpose you can use a Dispatcher. To write something in output window using this implementation now you can simple do this:

    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");
      }));
    }
    
    0 讨论(0)
提交回复
热议问题