2011-10-14 57 views
11

我正在写一个简单的Visual Studio 2010加载项来在工作中执行常见的复制作业(从libs sln获取dll)。如何写入Visual Studio 2010 AddIn的输出窗口?

我希望将复制的进度写入输出窗口。

我试过Trace.WriteLine(...)希望能够做到这一点,但是当我在调试器中运行加载项时,它不会。我还没有尝试过任何其他方式。

我发现了一些在Visual Studio 2008中这样做的例子,但所需的库不可用于引用。

任何人都可以指向我如何写入输出窗口?我的谷歌搜索技巧让我失望。

回答

16

我做这个的宏我写道:

Window window = dte.Windows.Item(EnvDTE.Constants.vsWindowKindOutput); 
OutputWindow outputWindow = (OutputWindow) window.Object; 
outputWindow.ActivePane.Activate(); 
outputWindow.ActivePane.OutputString(message); 

这里是DTE接口的链接: http://msdn.microsoft.com/en-us/library/envdte.dte(v=VS.100).aspx

+0

什么是对象dte? (现在阅读文档,但是在将来参考的答案中会很好) –

+1

对于那些关注的人,dte在connect.cs中的connect方法中定义。在文件的底部寻找它:private DTE2 _applicationObject;用它作为dte –

+0

这对我有用:) – Achilles

1

我写一个Visual Studio插件,并有同样的问题,但是当尝试上述答案时,我发现该行:

outputWindow.ActivePane.Activate(); 

发生了错误。

NullReferenceException - 未将对象引用设置为对象的实例。

不过我现在已经找到了一个稍微不同的方式来解决这个问题:

Window window = applicationObject.Windows.Item(Constants.vsWindowKindOutput); 
OutputWindow outputWindow = (OutputWindow)window.Object; 
OutputWindowPane owp; 
owp = outputWindow.OutputWindowPanes.Add("new pane"); 
owp.OutputString("hello"); 
8

正如罗伯特指出,在没有ActivePane约翰的代码会抛出异常。如果有活动窗格,它将使用任何一个窗格处于活动状态。

我对Robert的例子有一个问题,取决于你创建窗格的位置,在我的情况下,这是Exec方法,它将在每次运行时创建具有相同名称的多个窗格。

包括我的例子,我如何解决这个问题。很简单,只需检查窗口是否存在...

 Window   window   = _applicationObject.Windows.Item(EnvDTE.Constants.vsWindowKindOutput); 
     OutputWindow  outputWindow  = (OutputWindow)window.Object; 
     OutputWindowPane outputWindowPane = null; 

     for (uint i = 1; i <= outputWindow.OutputWindowPanes.Count; i++) 
     { 
     if (outputWindow.OutputWindowPanes.Item(i).Name.Equals(OUTPUT_WINDOW_NAME , StringComparison.CurrentCultureIgnoreCase)) 
     { 
      outputWindowPane = outputWindow.OutputWindowPanes.Item(i); 
      break; 
     } 
     } 

     if (outputWindowPane == null) 
     outputWindowPane = outputWindow.OutputWindowPanes.Add(OUTPUT_WINDOW_NAME); 

     outputWindowPane.OutputString("Message"); 
相关问题