ThisAddIn_ShutDown не выполняется

В моей надстройке для Outlook у меня есть следующие строки.

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
  MessageBox.Show("Hazaa!");            
}

private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
{
  MessageBox.Show("Shazoo...");
}

Пока Outlook приветствует меня крутым "Хазаа!" при запуске он отказывается говорить мне "Sahzoo...", когда я закрываю его. Оба метода регистрируются одинаково, используя автоматически сгенерированный код по умолчанию, поэтому я не подозреваю, что здесь есть какие-то ошибки. Другое объяснение, которое я могу придумать, заключается в том, что процесс закрытия выполняется, когда приложение уже покинуло графический интерфейс, а шазуинг скрыт.

Это так? Если нет, как я могу сделать так, чтобы Outlook меня шазу? Если да, то как я могу визуально уведомить пользователя о таком шазу?

РЕДАКТИРОВАТЬ:

Судя по всему, начиная с O10 отключение больше не вызывается, поэтому автоматически сгенерированный ниже код неверный действительно неверен (или, по крайней мере, не идеален). Предоставлено @Christian.K.

#region VSTO generated code
private void InternalStartup()
{
  this.Startup += new System.EventHandler(ThisAddIn_Startup);
  this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
}
#endregion

person Konrad Viltersten    schedule 07.09.2012    source источник


Ответы (2)


Вы используете Outlook 2010?

Начиная с Outlook 2010, Outlook по умолчанию не сигнализирует надстройкам о завершении работы. В частности, Outlook больше не вызывает методы OnBeginShutdown и OnDisconnection интерфейса IDTExtensibility2 во время быстрого завершения работы. Точно так же надстройка Outlook, написанная с помощью Microsoft Visual Studio Tools for Office, больше не вызывает метод ThisAddin_Shutdown при завершении работы Outlook.

person Christian.K    schedule 07.09.2012
comment
Ах, тогда MS должна обновить автоматически сгенерированный код. Смотрите обновление в исходном посте. Я точно не написал это сам. В любом случае, отличная информация, но возникает вопрос - как мне shazoo'fy моего пользователя при выключении? - person Konrad Viltersten; 07.09.2012
comment
Я думаю, что они остались в машине, хотя больше не выполняются, чтобы не ломать существующий код. Прочитав статью, я бы сказал, что вы не должны этого делать. Выключение должно быть быстрым. Поскольку приложение (внешний вид) все равно закрывается, нет смысла откладывать это с помощью (модального!) взаимодействия с пользователем. - person Christian.K; 07.09.2012
comment
Я не спорю, что это разумно или предпочтительно. Но я хотел бы знать, как это сделать, если клиент запрашивает такую ​​​​вещь. Предположим, они хотят, чтобы я что-то записал в БД или обновил CRM, как только они выходят из приложения. Тогда я не смогу убедить их в преимуществах быстрого выхода. Но позвольте мне подчеркнуть, что я согласен с вашей точкой зрения. - person Konrad Viltersten; 07.09.2012
comment
Вы действительно читали статью? Ознакомьтесь с рекомендациями по завершению работы надстроек для разработчиков, чтобы узнать, как по-прежнему выполнять код при завершении работы. Или Рекомендации по завершению работы надстроек для ИТ-администраторов, чтобы узнать о способах (выборочного) повторного включения перехватчиков. - person Christian.K; 07.09.2012
comment
Конечно я сделал. Дважды! И под этим я подразумеваю что-то вроде... Хрмп... А под это я подразумеваю совсем не то. Позор мне ... Я видел выделенный раздел вашего ответа и полностью пропустил ссылку ... Примите мои извинения. :) - person Konrad Viltersten; 07.09.2012
comment
@Christian.K, не могли бы вы помочь мне решить ту же проблему для PowerPoint - person Dah Sra; 30.09.2014
comment
@Christian.K, пожалуйста, помогите мне в stackoverflow.com/questions/26116448/ - person Dah Sra; 30.09.2014

Если вы используете Outlook 2010, вы можете попросить Outlook сообщить вашему подключаемому модулю, когда он закрывается.

[RequireShutdownNotification]=dword:0x1

Ключ должен быть помещен в папку реестра вашего плагина.

person Chriss    schedule 26.09.2012
comment
Вы имеете в виду AssemblyInfo.cs? - person Konrad Viltersten; 26.09.2012
comment
Нет, это параметр реестра, который вам необходимо сделать, см. статья, на которую я ссылался в своем ответе в разделе «Рекомендации по отключению надстроек для ИТ-администраторов». - person Christian.K; 28.09.2012