Я написал простую надстройку для Visual Studio 2008, которая открывает панель окна, которую можно закрепить.
Вы можете скачать исходный код и бинарный установщик, нажав здесь.
Природа надстройки означает, что в идеале она будет закреплена рядом с тем местом, где вы редактируете свой источник. Но иногда, на некоторых установках, он не остается пристыкованным. Вы запускаете VS, закрепляете мою панель, выключаете VS, перезапускаете VS, и черт побери - панель снова всплывает. На некоторых машинах мне приходится каждый раз переустанавливать его.
Но на других установках он остается пристыкованным, куда бы я ни положил его навсегда. Первоначально я думал, что это может быть разницей между Vista и XP, но теперь у меня есть сообщения о том, что он также отклеился от XP.
Из того, что я прочитал (и из-за того факта, что он иногда остается в доке), у меня сложилось впечатление, что VS должен позаботиться о сохранении состояния стыковки для меня. Но это не так. И все же другие плагины на той же установке VS не имеют этой проблемы. Поэтому я должен что-то сделать, чтобы улучшить ситуацию.
Я подозреваю, что единственная соответствующая часть моего кода - это:
public class Connect : IDTExtensibility2
{
private static DTE2 _applicationObject;
private AddIn _addInInstance;
private static CodeModelEvents _codeModelEvents;
public static DTE2 VisualStudioApplication
{
get { return _applicationObject; }
}
public static CodeModelEvents CodeModelEvents
{
get { return _codeModelEvents; }
}
public static event EventHandler SourceChanged = delegate { };
public void OnConnection(object application,
ext_ConnectMode connectMode, object addInInst, ref Array custom)
{
_applicationObject = (DTE2)application;
_addInInstance = (AddIn)addInInst;
}
public void OnStartupComplete(ref Array custom)
{
try
{
Events2 events = (Events2)_applicationObject.Events;
_codeModelEvents = events.get_CodeModelEvents(null);
object objTemp = null;
Windows2 toolWins = (Windows2)_applicationObject.Windows;
Window toolWin = toolWins.CreateToolWindow2(
_addInInstance, GetType().Assembly.Location, "Ora.OraPane", "Ora",
"{DC8A399C-D9B3-40f9-90E2-EAA16F0FBF94}", ref objTemp);
toolWin.Visible = true;
}
catch (Exception ex)
{
MessageBox.Show("Exception: " + ex.Message);
}
}
public void OnBeginShutdown(ref Array custom) { }
public void OnDisconnection(ext_DisconnectMode disconnectMode, ref Array custom) { }
public void OnAddInsUpdate(ref Array custom) { }
}
(Документы MSDN предполагают, что окно должно быть создано в OnConnection, но если я сделаю это, то окно в основном не появится.)