別のクラスを使用して処理を行うVS2010用のアドインを作成しました。この結果、出力ウィンドウの新しいペインにテキストが表示されます。
この処理クラスのコンストラクターは、アドインConnectクラスによって作成された新しいOutputWindowPaneへの参照を取ります。テキストは、OutputStringメソッドを使用して書き込まれます。
これは機能し、テキストは正しく表示されますが、実行がアドインConnectクラスに戻ると、すべてが1回の更新で表示されます。また、アドインの実行中にIDEがフリーズしているように見えることにも気づきました。アドイン開発は初めてですが、明らかなことを見逃したことがありますか?
このプロセスを変更して、OutputStringを呼び出すたびに出力ウィンドウのテキストを更新する方法はありますか?なんらかの更新方法を期待していたのですが、見つかりませんでした。
アップデート
これは別のクラスを使用することとは何の関係もないことに気づきました。次の例は私の問題を示しています。
using System;
using Extensibility;
using EnvDTE;
using EnvDTE80;
using Microsoft.VisualStudio.CommandBars;
namespace MyAddin4
{
public class Connect : IDTExtensibility2, IDTCommandTarget
{
public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
{
_applicationObject = (DTE2)application;
_addInInstance = (AddIn)addInInst;
if(connectMode == ext_ConnectMode.ext_cm_UISetup)
{
object []contextGUIDS = new object[] { };
Commands2 commands = (Commands2)_applicationObject.Commands;
string toolsMenuName = "Tools";
CommandBar menuBarCommandBar = ((CommandBars)_applicationObject.CommandBars)["MenuBar"];
CommandBarControl toolsControl = menuBarCommandBar.Controls[toolsMenuName];
CommandBarPopup toolsPopup = (CommandBarPopup)toolsControl;
try
{
Command command = commands.AddNamedCommand2(_addInInstance, "MyAddin4", "MyAddin4", "Executes the command for MyAddin4", true, 59, ref contextGUIDS, (int)vsCommandStatus.vsCommandStatusSupported+(int)vsCommandStatus.vsCommandStatusEnabled, (int)vsCommandStyle.vsCommandStylePictAndText, vsCommandControlType.vsCommandControlTypeButton);
if((command != null) && (toolsPopup != null))
{
command.AddControl(toolsPopup.CommandBar, 1);
}
}
catch(ArgumentException) {}
}
}
public void OnDisconnection(ext_DisconnectMode disconnectMode, ref Array custom) {}
public void OnAddInsUpdate(ref Array custom) {}
public void OnStartupComplete(ref Array custom) {}
public void OnBeginShutdown(ref Array custom) {}
public void QueryStatus(string commandName, vsCommandStatusTextWanted neededText, ref vsCommandStatus status, ref object commandText)
{
if(neededText == vsCommandStatusTextWanted.vsCommandStatusTextWantedNone)
{
if(commandName == "MyAddin4.Connect.MyAddin4")
{
status = (vsCommandStatus)vsCommandStatus.vsCommandStatusSupported|vsCommandStatus.vsCommandStatusEnabled;
return;
}
}
}
public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled)
{
handled = false;
if(executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault)
{
if(commandName == "MyAddin4.Connect.MyAddin4")
{
OutputWindow outputWindow = (OutputWindow) _applicationObject.Windows.Item(Constants.vsWindowKindOutput).Object;
OutputWindowPane outputPane = outputWindow.OutputWindowPanes.Add("Processor");
for (int i = 0; i < 10; i++)
{
System.Threading.Thread.Sleep(500);
outputPane.Activate();
outputPane.OutputString(i + "\n");
}
handled = true;
return;
}
}
}
private DTE2 _applicationObject;
private AddIn _addInInstance;
}
}
解決
@ShellShockからの回答に基づいて、これは私にとって有効なソリューションです。
using System;
using Extensibility;
using EnvDTE;
using EnvDTE80;
using Microsoft.VisualStudio.CommandBars;
namespace MyAddin4
{
public class Connect : IDTExtensibility2, IDTCommandTarget
{
public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
{
_applicationObject = (DTE2)application;
_addInInstance = (AddIn)addInInst;
if(connectMode == ext_ConnectMode.ext_cm_UISetup)
{
object []contextGUIDS = new object[] { };
Commands2 commands = (Commands2)_applicationObject.Commands;
string toolsMenuName = "Tools";
CommandBar menuBarCommandBar = ((CommandBars)_applicationObject.CommandBars)["MenuBar"];
CommandBarControl toolsControl = menuBarCommandBar.Controls[toolsMenuName];
CommandBarPopup toolsPopup = (CommandBarPopup)toolsControl;
try
{
Command command = commands.AddNamedCommand2(_addInInstance, "MyAddin4", "MyAddin4", "Executes the command for MyAddin4", true, 59, ref contextGUIDS, (int)vsCommandStatus.vsCommandStatusSupported+(int)vsCommandStatus.vsCommandStatusEnabled, (int)vsCommandStyle.vsCommandStylePictAndText, vsCommandControlType.vsCommandControlTypeButton);
if((command != null) && (toolsPopup != null))
{
command.AddControl(toolsPopup.CommandBar, 1);
}
}
catch(ArgumentException) {}
}
}
public void OnDisconnection(ext_DisconnectMode disconnectMode, ref Array custom) {}
public void OnAddInsUpdate(ref Array custom) {}
public void OnStartupComplete(ref Array custom) {}
public void OnBeginShutdown(ref Array custom) {}
public void QueryStatus(string commandName, vsCommandStatusTextWanted neededText, ref vsCommandStatus status, ref object commandText)
{
if(neededText == vsCommandStatusTextWanted.vsCommandStatusTextWantedNone)
{
if(commandName == "MyAddin4.Connect.MyAddin4")
{
status = (vsCommandStatus)vsCommandStatus.vsCommandStatusSupported|vsCommandStatus.vsCommandStatusEnabled;
return;
}
}
}
public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled)
{
handled = false;
if(executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault)
{
if(commandName == "MyAddin4.Connect.MyAddin4")
{
OutputWindow outputWindow = (OutputWindow) _applicationObject.Windows.Item(Constants.vsWindowKindOutput).Object;
OutputWindowPane outputPane = outputWindow.OutputWindowPanes.Add("Processor");
Worker workerObject = new Worker(ref outputPane);
uint loops = 10;
System.Threading.Thread thread = new System.Threading.Thread(delegate() { workerObject.DoWork(loops); });
thread.Start();
handled = true;
return;
}
}
}
private DTE2 _applicationObject;
private AddIn _addInInstance;
}
public class Worker
{
private EnvDTE.OutputWindowPane _pcLintOutputWindowPane;
public Worker(ref EnvDTE.OutputWindowPane pcLintOutputWindowPane)
{
_pcLintOutputWindowPane = pcLintOutputWindowPane;
}
public void DoWork(uint loops)
{
for (int i = 0; i < loops; i++)
{
System.Threading.Thread.Sleep(500);
WriteText(i + "\n");
}
}
private void WriteText(string stringToWrite)
{
_pcLintOutputWindowPane.Activate();
_pcLintOutputWindowPane.OutputString(stringToWrite);
}
}
}