【问题标题】:VSTO: Event Handler failing to fire after a rebootVSTO:重新启动后事件处理程序未能触发
【发布时间】:2018-11-01 21:59:36
【问题描述】:

我在 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 标志,按钮立即开始工作。

插件中的所有其他功能都有效,因此插件不会停止运行。

我不知道下一步该做什么。如果有人对为什么事件处理程序在重新启动之前和之后应该以不同的方式运行有惊人的洞察力(顺便卸载并重新安装插件会导致它在该会话中再次工作),我将非常感激。当问题无法在调试器下显示时,我也欢迎任何可以提出调试应用程序方法的建议。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 谢谢,问题解决了。有趣的是,安装后 GC 的工作方式有所不同。我可以理解 GC 在调试下的不同功能(例如,保留历史事件的句柄),但仅仅从安装开始就改变让我感到困惑。
    • 这就是 GC 的问题——它是不确定的。保证会清理干净,只是你不知道什么时候。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    • 2012-04-15
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多