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