В моем плагине VSTO я использую следующие члены класса для хранения указателей на currentExplorer, currentAppointmentItem и currentExplorers.
В Startup я пытаюсь настроить все необходимые обработчики событий следующим образом:
currentExplorers = this.Application.Explorers;
foreach (Outlook.Explorer explorer in currentExplorers)
{
((Outlook.ExplorerEvents_10_Event)explorer).Activate +=
new Outlook.ExplorerEvents_10_ActivateEventHandler(
Explorer_Activate);
explorer.Deactivate += new
Outlook.ExplorerEvents_10_DeactivateEventHandler(
Explorer_Deactivate);
}
currentExplorers.NewExplorer += New_Explorer;
Мои обработчики событий выглядят следующим образом:
void New_Explorer(Outlook.Explorer explorer)
{
if (currentExplorer != null)
{
Marshal.ReleaseComObject(currentExplorer);
}
currentExplorer = explorer;
currentExplorer.SelectionChange += new Outlook.ExplorerEvents_10_SelectionChangeEventHandler(Selection_Change);
currentExplorer.Deactivate += new Outlook.ExplorerEvents_10_DeactivateEventHandler(Explorer_Deactivate);
}
void Explorer_Deactivate()
{
if (currentExplorer != null)
{
currentExplorer.SelectionChange -= new Outlook.ExplorerEvents_10_SelectionChangeEventHandler(Selection_Change); ;
Marshal.ReleaseComObject(currentExplorer);
currentExplorer = null;
}
}
void Explorer_Activate()
{
if (currentExplorer != null)
{
Marshal.ReleaseComObject(currentExplorer);
}
currentExplorer = this.Application.ActiveExplorer();
currentExplorer.SelectionChange += new Outlook.ExplorerEvents_10_SelectionChangeEventHandler(Selection_Change);
}
private void Selection_Change()
{
if (currentExplorer == null)
{
return;
}
try
{
Outlook.MAPIFolder selectedFolder = currentExplorer.CurrentFolder;
if (currentExplorer.Selection.Count > 0)
{
Object selObject = currentExplorer.Selection[1];
if (selObject is Outlook.AppointmentItem)
{
if (currentAppointmentItem != null)
{
Marshal.ReleaseComObject(currentAppointmentItem);
}
currentAppointmentItem = (Outlook.AppointmentItem)selObject;
}
else
{
currentAppointmentItem = null;
}
}
} catch(Exception ex)
{
log.Error(ex.Message);
}
}
Я устанавливаю точки останова для каждого обработчика событий. Проблема заключается в том, что когда я отлаживаю свой плагин Outlook, ни один из обработчиков событий не вызывается, кроме Explorer_Deactivate. Когда я отлаживаю там, я вижу, что currentExplorer все еще имеет значение null, поэтому я предполагаю, что он по какой-то причине вызывается во время инициализации Outlook (в это время виден только экран spla sh Outlook)
Что я делаю не так? Я ожидал, что каждый выбор любого элемента (в Mail, Calendar и т.д. c.) Вызовет Selection_Change, но, к сожалению, это не так