VSTO:重新启动后事件处理程序无法触发

时间:2018-11-01 08:22:48

标签: c# event-handling vsto outlook-addin

我在Outlook的C#VSTO插件中遇到了一个问题。
启动时注册了一个事件处理程序,当选择一个项目时,该事件处理程序将更新主资源管理器窗口的功能区上的按钮。最初(由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 :(得分:1)

您需要具有一个全局(类)变量,该变量存储指向Explorer对象的指针。否则,它将被垃圾收集器释放。如果不这样做,它只会在发布之前触发事件。