我正在编写一个简单的Visual Studio 2010加载项,以便在工作中执行常见的复制工作(从libs sln获取dll)。
我希望将复制的进度写入输出窗口。
我尝试Trace.WriteLine(...)
期望这样做,但是当我在调试器中运行加载项时却没有。我还没有尝试过任何其他方式。
我在Visual Studio 2008中找到了一些这样做的示例,但是无法引用所需的库。
有人能指出我如何写入输出窗口?我的谷歌搜索技能让我失望。
答案 0 :(得分: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
答案 1 :(得分:8)
正如罗伯特所指出的,当没有ActivePane时,John的代码将抛出异常。如果有活动窗格,它将使用任何活动窗格。
我在罗伯特的例子中遇到的一个问题取决于你创建窗格的位置,在我的例子中是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" );
答案 2 :(得分: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");