当通过 Word 或 Excel 上的“发送邮件”选项触发 Outlook 启动时,Outlook 2007 加载项启动崩溃

Outlook 2007 Addin Startup Crash due when Outlook startup trigger via Send Mail option on Word or Excel

在我的新工作开始开发 Outlook 2007 插件后,用户遇到了以下错误: Object reference not set to an instance of an object 在 Outlook 启动期间。在尝试通过额外的尝试捕获来跟踪问题之后,因为来自未抑制警报的初始 VSTO 异常消息并不是特别有用。我将问题跟踪到以此代码开头的方法:

if (newToolBar == null)
{
    Office.CommandBars cmdBars = this.Application.ActiveExplorer().CommandBars;
    newToolBar = cmdBars.Add("Data Team Toolbar", Office.MsoBarPosition.msoBarTop, false, true);
} 

作为 VSTO 的新手,我的第一个假设是 ActiveExplorer().CommandBars 返回 null。 在进一步通信之后,我能够与我的最终用户确认他们已经使用 Excel 的邮件菜单中的发送邮件选项启动了 Outlook。 (这完全不是我预料到的情况。)这似乎与我的主 Outlook window 未及时打开的理论相吻合,并且我能够始终如一地成功重现崩溃。

因此我添加了以下代码

if (this.Application.ActiveExplorer() == null )
{
    // If Outlook is opened via some other method ie. send on Excel or Word
    // Kill Addin nicely.
    this.OnShutdown();
}

然而,当我在 UAT 下发布这个版本时我很快意识到(因为我似乎找不到在 Visual Studio 中重现该问题的方法(命令开关(https://support.office.com/en-sg/article/Command-line-switches-for-Microsoft-Office-Outlook-2007-92de9e0b-4f97-42a2-8e02-89c4a8294916) 特别是“/c ipm.note”设置为调试参数似乎对调试启动过程没有影响。

这似乎是按照 link (VSTO Outlook integration - Outlook shutdown event for synchronization) 关闭 Outlook,而不是像我想象的那样只是插件。

从设计的角度来看,我想到的唯一解决方案(虽然不理想)是禁止插件在这种情况下采取进一步行动,但允许它在正常启动条件下再次 运行无需用户干预。我认为逻辑可以包含在像这样的保护条款中,

if (this.Application.ActiveExplorer().Caption != "Microsoft Outlook")
{
    //Disabling code//
}

但我不确定如何或是否要实现它, 由于我的插件对工具栏有很多依赖性(这个解决方案意味着需要添加很多非常具体的保护条款来检查工具栏是否存在,如果可能的话我宁愿避免这样做。理想情况下我希望插件能够如果以这种方式打开,能够检测它是否在不同的方法下 运行,并且只有当 Outlook 的主要 window 可见时才加载工具栏,我已经有一个后台主循环作为其他要求。所以可能是?

if(DataTeamAddin.LoadStyle != "Normal")
{
    if(OutlookMainWindowVisible == true && ToolbarIsNotLoaded == true)
    {
        BeginToolbarSetup();
    }
    else
    {
        //Resume Main Loop
    }
}

但是我不确定该怎么做?更不用说如何使用 MSTest 中的自动化测试来测试它了,因为我什至无法在我的 VS2013 中重现该问题 IDE?

一切准备就绪后,你能运行你的代码吗?

https://msdn.microsoft.com/en-us/library/bb147656(v=office.12).aspx

首先,命令栏已弃用。考虑改用 Fluent UI。您可以在 MSDN 中的以下系列文章中阅读有关新 UI 的更多信息:

其次,当 Outlook 运行 来自其他 Office 应用程序时,这是一个已知的情况。只有检查员 window 可用。您可以订阅 NewInspector 或 InspectorActivate 事件,以便在使用“发送到”命令时了解加载项 运行。