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

C# 通过Word或Excel上的“发送邮件”选项触发Outlook启动时,Outlook 2007加载项启动崩溃,c#,vsto,sendmail,outlook-addin,outlook-2007,C#,Vsto,Sendmail,Outlook Addin,Outlook 2007,在我的新作业中开始Outlook 2007加载项的开发后,用户遇到以下错误: 在Outlook启动期间,对象引用未设置为对象的实例。在尝试通过其他try捕获跟踪问题之后,来自unsuppressed警报的初始VSTO异常消息并不是特别有用。我将问题跟踪到以以下代码开头的方法: if (newToolBar == null) { Office.CommandBars cmdBars = this.Application.ActiveExplorer().CommandBars; n

在我的新作业中开始Outlook 2007加载项的开发后,用户遇到以下错误: 在Outlook启动期间,对象引用未设置为对象的实例。在尝试通过其他try捕获跟踪问题之后,来自unsuppressed警报的初始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主窗口当时没有打开的理论相一致,我能够成功地重现崩溃

因此,我添加了以下代码

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下发布这个版本时,我很快意识到了这一点(因为我似乎找不到在VisualStudio中重现这个问题的方法(命令开关() 具体来说,设置为调试参数的“/c ipm.note”似乎对调试启动过程没有影响

这似乎是根据此链接()关闭Outlook,而不仅仅是我所想的加载项

我从设计角度考虑过的唯一解决方案(虽然不理想)是禁止加载项在此场景下采取进一步行动,但允许它在正常启动条件下再次运行,而无需用户干预。我认为逻辑可以包含在这样的保护条款中

if (this.Application.ActiveExplorer().Caption != "Microsoft Outlook")
{
    //Disabling code//
}
但我不确定我是如何或是否想要实现这一点, 因为我的加载项在工具栏上有很多依赖项(此解决方案意味着需要添加许多用于检查工具栏存在的非常具体的保护条款,如果可能的话,我宁愿避免添加这些条款。理想情况下,我希望加载项能够检测以这种方式打开时是否以不同的方式运行,并且仅在Outlook主窗口可见时加载工具栏,作为其他需求的一部分,我已经有了一个后台主循环

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

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

一切就绪后,您能运行代码吗


首先,命令栏被弃用。考虑使用FLUENT UI。您可以在MSDN中的以下系列文章中阅读更多关于新UI的内容:


其次,当Outlook从其他Office应用程序运行时,这是一种已知的情况。只有inspector窗口可用。您可以订阅NewInspector或InspectorActivate事件,以便在使用Send to命令时知道加载项正在运行。

我将把启动逻辑迁移到此事件,并通知您。我想使用Fluent但据我所知,这不是Outlook主资源管理器上UI控件的选项,只是在2010年添加的?我打算在为Excel开发时添加它。或者有解决方法吗?