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

后端 未结 6 2088
耶瑟儿~
耶瑟儿~ 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: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");
      }));
    }
    

提交回复
热议问题