Outlook VSTO正确处理SelectionChange(当前双击崩溃Addin)

Outlook VSTO正确处理SelectionChange(当前双击崩溃Addin),outlook,vsto,outlook-addin,Outlook,Vsto,Outlook Addin,据我所知,您需要跟踪探险者的激活和停用。在激活期间,您需要为当前资源管理器添加SelectionChange事件处理程序。 这似乎非常适用于单击AppointmentItems。但当双击约会系列并选择单个约会时,它会使加载项崩溃 资料来源如下: 在班级层面 private Outlook.Explorer currentExplorer = null; private Outlook.AppointmentItem currentAppointmentItem = null;

据我所知,您需要跟踪探险者的激活和停用。在激活期间,您需要为当前资源管理器添加SelectionChange事件处理程序。 这似乎非常适用于单击AppointmentItems。但当双击约会系列并选择单个约会时,它会使加载项崩溃

资料来源如下: 在班级层面

    private Outlook.Explorer currentExplorer = null;
    private Outlook.AppointmentItem currentAppointmentItem = null;
启动期间:

       currentExplorer = this.Application.ActiveExplorer();

        ((Outlook.ExplorerEvents_10_Event)currentExplorer).Activate +=
        new Outlook.ExplorerEvents_10_ActivateEventHandler(
        Explorer_Activate);

        currentExplorer.Deactivate += new
        Outlook.ExplorerEvents_10_DeactivateEventHandler(
        Explorer_Deactivate);
事件处理程序:

    void Explorer_Activate()
    {
        currentExplorer.SelectionChange += new Outlook.ExplorerEvents_10_SelectionChangeEventHandler(Selection_Change);
    }

    void Explorer_Deactivate()
    {
        currentExplorer.SelectionChange -= new Outlook.ExplorerEvents_10_SelectionChangeEventHandler(Selection_Change); ;
    }

    private void Close_Explorer()
    {

    }

    private void Selection_Change()
    {
        Outlook.MAPIFolder selectedFolder = currentExplorer.CurrentFolder;            
        if (currentExplorer.Selection.Count > 0)
        {
            Object selObject = currentExplorer.Selection[1];
            if (selObject is Outlook.AppointmentItem)
            {
                currentAppointmentItem = (Outlook.AppointmentItem)selObject;
            }
            else
            {
                currentAppointmentItem = null;
            }
        }
    }

我忽略了什么?取消注册的形式是否存在问题?

尝试将Try/catch块添加到事件处理程序中。Outlook对象模型有时会给您带来不可预测的结果。值得添加它们并查找引发异常的位置

currentExplorer.Selection.Count 

此外,您可以在事件中订阅
SelectionChange
事件,并且在激活或停用资源管理器时不在它们之间切换。每当打开新的资源管理器窗口时,无论是由于用户操作还是通过程序代码,都会触发该事件

尝试将Try/catch块添加到事件处理程序中。Outlook对象模型有时会给您带来不可预测的结果。值得添加它们并查找引发异常的位置

currentExplorer.Selection.Count 

此外,您可以在事件中订阅
SelectionChange
事件,并且在激活或停用资源管理器时不在它们之间切换。每当打开新的资源管理器窗口时,无论是由于用户操作还是通过程序代码,都会触发该事件

我唯一添加的是NewInspector和InspectorClose事件的处理程序以及Marshal.ReleaseComObject()。我能想象的唯一一件事是,在调试过程中双击我遇到了某种竞争条件(因为双击也会触发Selection_Change事件)。但这只是一个猜测。

我添加的唯一内容是NewInspector和InspectorClose事件的处理程序以及Marshal.ReleaseComObject()。我能想象的唯一一件事是,在调试过程中双击我遇到了某种竞争条件(因为双击也会触发Selection_Change事件)。但这只是一个猜测。

在启用/停用资源管理器时,不需要添加和删除事件处理程序。您正在尝试支持多个探索者吗?在这种情况下,创建一个包装类,将
Explorer
对象作为其成员,并将其方法用作事件处理程序。

在激活/停用资源管理器时,无需添加和删除事件处理程序。您正在尝试支持多个探索者吗?在这种情况下,创建一个包装类,将
Explorer
对象作为其成员,并将其方法用作事件处理程序。

现在我改为NewExplorer/CloseExplorer方法(请参阅)问题仍然存在,我改为NewExplorer/CloseExplorer方法(请参阅)问题仍然存在必须从
SelectionChange
事件处理程序中删除断点。只需从
SelectionChange
事件处理程序中删除断点。