0

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

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

我已经实现了它,但是即使在Connect从 Native 加载项将 VSTO 加载项的属性设置为 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 秒启动限制。

我将衷心感谢您的帮助!

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

4

1 回答 1

0

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

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

您可以在应用程序启动时间文章中阅读更多相关信息。

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

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

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

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

当您重新启用软禁用的 VSTO 外接程序时,应用程序会立即尝试加载 VSTO 外接程序。如果最初导致应用程序软禁用 VSTO 插件的问题尚未修复,应用程序将再次软禁用 VSTO 插件。在如何:重新启用已禁用的 VSTO 加载项一文中阅读有关此内容的更多信息。

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

于 2016-10-27T21:17:16.640 回答