#visual-studio #visual-studio-2010 #visual-studio-addins
#visual-studio #visual-studio-2010 #visual-studio-addins
Вопрос:
Я заметил, что во время установки продукта пакета VS (например http://www.continuoustests.com / ) devenv.exe
запускается, и я замечаю, что иногда загружается мой VS addin (вызывается его OnConnection()
метод), и это может спровоцировать сбой.
Проблема в том, что когда-нибудь, поскольку я не могу воспроизвести условия, в которых загружается мой VS addin. Из моего журнала сбоев я знаю, что это случается редко, только с VS2010 devenv.exe
, и я также знаю, что он не зависит от архитектуры компьютера x86 / x64. Я попытался установить / деинсталлировать дополнительные дополнения, не имея запущенного экземпляра VS или запущенных экземпляров VS, VS2008 или VS2010.
Кто-нибудь имеет представление о том, как воспроизвести проблему при загрузке моего дополнения VS?
Кстати, я уверен, что у меня есть решение проблемы, поскольку у OnConnection()
меня уже есть подобный код…
switch (connectMode) {
case ext_ConnectMode.ext_cm_External: // This setting is no longer used by Visual Studio. (http://msdn.microsoft.com/en-us/library/extensibility.ext_connectmode(v=vs.80).aspx)
case ext_ConnectMode.ext_cm_CommandLine:// The add-in was loaded from the command line, don't support it so far
case ext_ConnectMode.ext_cm_UISetup: // addin loaded for the first time, we don't need it (http://msmvps.com/blogs/carlosq/archive/2008/10/13/the-onconnection-method-and-ext-connectmode-ext-cm-uisetup-of-visual-studio-add-ins.aspx)
return;
case ext_ConnectMode.ext_cm_AfterStartup:
case ext_ConnectMode.ext_cm_Startup:
case ext_ConnectMode.ext_cm_Solution:
break;
}
… но после OnStartupComplete()
обратного вызова я забыл проверить введенное connectMode
значение OnConnection()
, отсюда и сбой.
В любом случае возможность воспроизвести ошибку утешила бы меня в исправлении.
Комментарии:
1. Кстати, я прочитал статью mztools.com/articles/2008/MZ2008004.aspx это не упоминает случай побочного эффекта при установке / деинсталляции пакета extraVS.
2. Как выглядел (иногда сбой) код?
3. Это просто типичный NullReferenceEx из моего кода!
Ответ №1:
Обновление: 10 октября 2011
После дополнительного тестирования и отзывов пользователей, которые повторяют проблему, оказывается, что моя теория была неверной: connectMode
на самом деле находится в диапазоне [ext_cm_AfterStartup, ext_cm_Startup, ext_cm_Solution]
.
Проблема возникает только с VS2010 и связана с тем, что у дополнения нет элемента пользовательского интерфейса, вызывающего что-то вроде dte.MainWindow
, или HwndSource.FromHwnd(new IntPtr(mainWindow.HWnd)).RootVisual
быть нулевым.
Я разговаривал с Карлосом Кинтеро http://msmvps.com/blogs/carlosq /, мировой эксперт по VS addin, который никогда не наблюдал этот случай. VS2010 не должен загружать какие-либо дополнения в сценарии установки / удаления расширения VS, и, похоже, это происходит случайным образом или, что более вероятно, в неизвестных и редких условиях.
Я добавлю еще один try/catch
, чтобы обойти еще одну ошибку добавления VS2010: (