Надстройка Outlook 2010 Com - NewExplorer никогда не срабатывает

По какой-то причине в моем приложении мой FolderSwitch работает в главном проводнике, который открывается вместе с приложением, но событие NewExplorer никогда не срабатывает, поэтому, очевидно, событие FolderSwitch не будет срабатывать в новом проводнике.

Я не могу понять, почему событие не срабатывает.

private List<_Outlook.Explorer> ListOfExplorerWindows = new List<_Outlook.Explorer> { };
private _Outlook.Application Application;

public void OnConnection(object Application, Extensibility.ext_ConnectMode ConnectMode, object AddInInst, ref Array custom)
{
    this.Application = (_Outlook.Application)Application;
}

public void OnStartupComplete(ref Array custom)
{
    _Outlook.Explorer Explorer = this.Application.ActiveExplorer();
    Explorer.FolderSwitch += new _Outlook.ExplorerEvents_10_FolderSwitchEventHandler(Explorer_FolderSwitch);
    ListOfExplorerWindows.Add(Explorer);

    this.Application.Explorers.NewExplorer += new _Outlook.ExplorersEvents_NewExplorerEventHandler(Explorers_NewExplorer);
}

private void Explorers_NewExplorer(_Outlook.Explorer Explorer)
{
    Explorer.FolderSwitch += new _Outlook.ExplorerEvents_10_FolderSwitchEventHandler(Explorer_FolderSwitch);
    ListOfExplorerWindows.Add(Explorer);
}

person Matt    schedule 02.03.2012    source источник
comment
На самом деле, я, возможно, исправил это, добавив частные проводники _Outlook.Explorers; однако на уровне класса я думал, что private _Outlook.Application Application; будет держать его в рамках, может кто-нибудь объяснить?   -  person Matt    schedule 02.03.2012
comment
Для моей собственной информации: где вы привязываетесь к OnConnection и OnStartupComplete? Какой объект имеет эти события?   -  person Scott Baker    schedule 20.09.2015
comment
Я не думаю, что это события, это общедоступные методы интерфейса IExtensibility2.   -  person Matt    schedule 21.09.2015


Ответы (1)


Для любых событий, которые вы хотите сохранить при использовании VSTO, вам необходимо сохранить член уровня класса (Explorer, Application, Inspector, CommandBar и т. д.), чтобы предотвратить их удаление потоком GC. . Это оптимизация ресурсов, но также может быть болезненным уроком.

См. соответствующий сообщение на форуме MSDN относительно время жизни события или аналогичный пост SO.

person SliverNinja - MSFT    schedule 02.03.2012
comment
Да, но у меня есть частное приложение _Outlook.Application; который является объектом уровня класса приложения, однако этого кажется недостаточно, вот чего я не понимаю. Мои Application.Explorers собираются сборщиком мусора, даже если приложение объявлено на уровне класса? - person Matt; 05.03.2012