我一直在开发用于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)对我来说只是一个部分解决方案,因为我需要在功能区中禁用某些项目上的按钮,所以我需要插件才能真正加载。此外,有时按钮消失没有任何明显的原因,它需要最终用户做一些魔术来取回它,这不是我的选择。
答案 0 :(得分:0)
相反,我建议您查看现有VSTO解决方案的源代码。将任何业务逻辑移动到辅助线程,以便Outlook可以尽可能快地加载插件。此外,您可以使用标准的.net机制来减少启动时间,例如:
您可以在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文章中详细了解相关内容。
您是否尝试手动启用加载项?你得到相同的结果吗?