在启动时从本机COM加载项加载Outlook VSTO加载项

时间:2016-10-27 11:23:52

标签: outlook vsto office365 outlook-addin outlook-2016

我一直在开发用于Outlook的VSTO插件,并且在一些客户的PC上遇到了缓慢加载问题(这显然是所有托管办公室加载项的慢性疾病,因为CLR加载计入整个插件加载时间)。

我已经阅读了一个解决方法,通过从快速加载的Native COM加载项将Connect属性设置为true,可以加载VSTO插件:https://blogs.msdn.microsoft.com/andreww/2008/04/19/delay-loading-the-clr-in-office-add-ins/

我已经实现了它,但是即使在从Native加载项将VSTO加载项的Connect属性设置为true之后,它仍然未加载。我在OnStartupComplete执行以下代码:

CComVariant vtItem("VSTOAddInName");

Office::COMAddInsPtr spCOMAddins;
m_spOutlook->get_COMAddIns(&spCOMAddins);
if (spCOMAddins) {
    Office::COMAddInPtr spCOMAddIn;
    if (spCOMAddins->Item(&vtItem, &spCOMAddIn) == S_OK)
    {
        spCOMAddIn->put_Connect(VARIANT_TRUE);
        // I see this message!
        MessageBoxW(NULL, L"Connected flag set", L"Native_Addin", MB_OK);
    }
}
return S_OK;

m_spOutlook定义为:

Outlook::_ApplicationPtr m_spOutlook;

我看到MessageBox,所以我假设设置了Connect属性,但是仍然没有加载插件。我已尝试使用所有可能的LoadBehavior设置,但这些都不起作用。所以问题是这种解决方法是否有效?也许我应该在与OnStartupComplete不同的回调下执行它。对于我来说很好,因为在Outlook开始后几秒钟就加载了插件,我只需要它加载而不是达到1秒的启动限制。

我真的很感谢你的帮助!

P.S。加载一次延迟加载的VSTO插件(LoadBehavior = 16)对我来说只是一个部分解决方案,因为我需要在功能区中禁用某些项目上的按钮,所以我需要插件才能真正加载。此外,有时按钮消失没有任何明显的原因,它需要最终用户做一些魔术来取回它,这不是我的选择。

1 个答案:

答案 0 :(得分:0)

相反,我建议您查看现有VSTO解决方案的源代码。将任何业务逻辑移动到辅助线程,以便Outlook可以尽可能快地加载插件。此外,您可以使用标准的.net机制来减少启动时间,例如:

  • 使用NGen.exe将代码生成从应用程序启动时间移至安装时间。
  • 利用GAC。如果未在全局程序集缓存(GAC)中安装程序集,则由于强名称程序集的哈希验证和Ngen映像验证(如果计算机上可用该程序集的本机映像)而导致延迟。对于GAC中安装的所有程序集,将跳过强名称验证。有关详细信息,请参阅Gacutil.exe(全局程序集缓存工具)。
  • 推迟初始化操作。考虑推迟初始化代码,直到呈现主应用程序窗口。请注意,可以在类构造函数中执行初始化,如果初始化代码引用其他类,则可能会导致执行许多类构造函数的级联效果。
  • Authenticode验证会增加启动时间。必须使用证书颁发机构(CA)验证Authenticode签名的程序集。此验证可能非常耗时,因为它可能需要多次连接到网络才能下载当前的证书吊销列表。它还确保在到受信任根的路径上有完整的有效证书链。加载程序集时,这可能会导致几秒钟的延迟。

您可以在Application Startup Time文章中详细了解相关内容。

Connect属性设置为true后,您的加载项是否显示在Disabled Items列表中?

Microsoft Office应用程序可以禁用意外行为的VSTO加载项。如果应用程序未加载VSTO加载项,则应用程序可能已禁用硬件或软件禁用VSTO加载项。

当VSTO加载项导致应用程序意外关闭时,可能会发生硬禁用。如果在VSTO加载项中的启动事件处理程序正在执行时停止调试器,则可能还会在开发计算机上发生此错误。

当VSTO加载项产生不会导致应用程序意外关闭的错误时,可能会发生软禁用。例如,如果在启动事件处理程序执行时抛出未处理的异常,应用程序可能会软禁用VSTO加载项。

当您重新启用软禁用的VSTO加载项时,应用程序会立即尝试加载VSTO加载项。如果最初导致应用程序软件禁用VSTO加载项的问题尚未修复,则应用程序将再次软禁用VSTO加载项。请在How to: Re-enable a VSTO Add-in That Has Been Disabled文章中详细了解相关内容。

您是否尝试手动启用加载项?你得到相同的结果吗?