VSTO: обработчик событий не запускается после перезагрузки - PullRequest
0 голосов
/ 01 ноября 2018

Я столкнулся с проблемой в C # VSTO addin for Outlook.
При запуске зарегистрирован обработчик событий, который обновляет кнопку на ленте главного окна обозревателя при выборе элемента. При первоначальном развертывании (Clickonce) надстройка работает безупречно. Изменение выбора обновляет кнопку каждый раз.
Код для регистрации обработчика события ниже:

Outlook.ExplorerEvents_10_SelectionChangeEventHandler selectionChangeEventHandler;

private void RegisterEvents(Outlook.Explorer Explorer)
{
    try
    {
        log.Debug("Registering Events");
        Application.Explorers.NewExplorer += Explorers_NewExplorer;
        selectionChangeEventHandler = new Outlook.ExplorerEvents_10_SelectionChangeEventHandler(ThisAddIn_SelectionChange);
        Explorer.SelectionChange -= selectionChangeEventHandler;
        Explorer.SelectionChange += selectionChangeEventHandler;
        this.Application.OptionsPagesAdd -= Application_OptionsPagesAdd;
        this.Application.OptionsPagesAdd += Application_OptionsPagesAdd;
        Application.ItemSend -= Application_ItemSend;
        Application.ItemSend += Application_ItemSend;
        log.Debug("Events Registration Succeeded");
     }
     catch (Exception ex)
     {
         log.Debug("Event Registration Failed");
         log.Error(ex.Message);
         log.Error(ex.StackTrace);
     }
 }

 private void Explorers_NewExplorer(Outlook.Explorer Explorer)
 {
     RegisterEvents(Explorer);
 }

При таком способе регистрации

 RegisterEvents(Application.ActiveExplorer());

Однако после перезагрузки обработчик событий запускается дважды, а затем никогда не запускается снова.

Чтобы попытаться отследить проблему, я добавил строку для запуска отладчика, если в app.config установлена ​​строка (как показано ниже)

if (String.Equals(ConfigurationManager.AppSettings.Get("attachDebugger"), "true", StringComparison.OrdinalIgnoreCase))
    Debugger.Launch();

После перезагрузки я могу запустить Outlook и посмотреть, как плагин не может обновить выбор. Затем закройте Outlook, переключите флаг attachDebugger в конфиге, и кнопка сразу начнет работать.

Все остальные функции в надстройке работают, так что это не тот случай, когда надстройка останавливается.

Я не знаю, что делать дальше. Если у кого-то есть поразительное понимание того, почему обработчик событий должен работать по-разному до и после перезагрузки (случайное удаление и переустановка плагина заставляет его снова работать для этого сеанса), я был бы очень благодарен. Я также приветствовал бы любой совет, который может предложить методы отладки приложения, когда проблема не может проявиться в отладчике.

1 Ответ

0 голосов
/ 01 ноября 2018

Вам нужна глобальная (классовая) переменная, в которой хранится указатель на объект Explorer. В противном случае он освобождается сборщиком мусора. Если вы этого не сделаете, он запускает события только до его выпуска.

...