在启动时从本机 COM 加载项加载 Outlook VSTO 加载项
Loading Outlook VSTO add-in from the native COM add-in on startup
我一直在为 Outlook 和一些客户的 PC 运行 开发 VSTO 插件以解决加载缓慢的问题(这显然是所有托管办公室加载项的慢性病,因为 CLR 加载被计算在内整个插件加载时间)。
我读过一个解决方法,即可以通过将快速加载的本机 COM 加载项的 Connect
属性 设置为 true 来加载 VSTO 插件:https://blogs.msdn.microsoft.com/andreww/2008/04/19/delay-loading-the-clr-in-office-add-ins/
我已经实现了它,但是即使在从本机加载项将 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,所以我假设连接 属性 已设置,但插件仍然没有加载。我已尝试使用所有可能的 LoadBehavior 设置和这些工作的 none。所以问题是这个解决方法是否应该起作用?也许我应该在不同于 OnStartupComplete
的回调下执行它。在 outlook 启动几秒钟后加载插件对我来说很好,我只需要加载它而不是达到 1 秒启动限制。
非常感谢您的帮助!
P.S。加载一次延迟加载的 VSTO 插件 (LoadBehavior=16) 对我来说只是部分解决方案,因为我需要在某些项目上禁用功能区中的按钮,所以我需要真正加载插件。此外,有时按钮会在没有任何明显原因的情况下消失,这需要最终用户使用一些魔法才能将其取回,这对我来说不是一个选择。
相反,我建议查看现有 VSTO 解决方案的源代码。将任何业务逻辑移至辅助线程,以便 Outlook 可以尽可能快地加载插件。此外,您可以使用标准的 .net 机制来减少启动时间,例如:
- 使用 NGen.exe 将代码生成从应用程序启动时间移动到安装时间。
- 利用 GAC。如果程序集未安装在全局程序集缓存 (GAC) 中,则强名称程序集的哈希验证和 Ngen 图像验证会导致延迟(如果该程序集的本机映像在计算机上可用)。 GAC 中安装的所有程序集都会跳过强名称验证。有关详细信息,请参阅 Gacutil.exe(全局程序集缓存工具)。
- 推迟初始化操作。考虑将初始化代码推迟到呈现主应用程序 window 之后。请注意,初始化可能在 class 构造函数内部执行,如果初始化代码引用其他 classes,则可能会导致执行许多 class 构造函数的级联效应。
- Authenticode 验证会增加启动时间。 Authenticode 签名的程序集必须通过证书颁发机构 (CA) 进行验证。此验证可能很耗时,因为它可能需要多次连接到网络才能下载当前的证书吊销列表。它还确保在通往受信任根的路径上存在完整的有效证书链。在加载程序集时,这可能会导致几秒钟的延迟。
您可以在 Application Startup Time 文章中阅读更多相关信息。
连接 属性 设置为真后,您的加载项是否显示在禁用项目列表中?
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 文章中阅读更多相关信息。
您是否尝试过手动启用加载项?你得到相同的结果吗?
我一直在为 Outlook 和一些客户的 PC 运行 开发 VSTO 插件以解决加载缓慢的问题(这显然是所有托管办公室加载项的慢性病,因为 CLR 加载被计算在内整个插件加载时间)。
我读过一个解决方法,即可以通过将快速加载的本机 COM 加载项的 Connect
属性 设置为 true 来加载 VSTO 插件:https://blogs.msdn.microsoft.com/andreww/2008/04/19/delay-loading-the-clr-in-office-add-ins/
我已经实现了它,但是即使在从本机加载项将 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,所以我假设连接 属性 已设置,但插件仍然没有加载。我已尝试使用所有可能的 LoadBehavior 设置和这些工作的 none。所以问题是这个解决方法是否应该起作用?也许我应该在不同于 OnStartupComplete
的回调下执行它。在 outlook 启动几秒钟后加载插件对我来说很好,我只需要加载它而不是达到 1 秒启动限制。
非常感谢您的帮助!
P.S。加载一次延迟加载的 VSTO 插件 (LoadBehavior=16) 对我来说只是部分解决方案,因为我需要在某些项目上禁用功能区中的按钮,所以我需要真正加载插件。此外,有时按钮会在没有任何明显原因的情况下消失,这需要最终用户使用一些魔法才能将其取回,这对我来说不是一个选择。
相反,我建议查看现有 VSTO 解决方案的源代码。将任何业务逻辑移至辅助线程,以便 Outlook 可以尽可能快地加载插件。此外,您可以使用标准的 .net 机制来减少启动时间,例如:
- 使用 NGen.exe 将代码生成从应用程序启动时间移动到安装时间。
- 利用 GAC。如果程序集未安装在全局程序集缓存 (GAC) 中,则强名称程序集的哈希验证和 Ngen 图像验证会导致延迟(如果该程序集的本机映像在计算机上可用)。 GAC 中安装的所有程序集都会跳过强名称验证。有关详细信息,请参阅 Gacutil.exe(全局程序集缓存工具)。
- 推迟初始化操作。考虑将初始化代码推迟到呈现主应用程序 window 之后。请注意,初始化可能在 class 构造函数内部执行,如果初始化代码引用其他 classes,则可能会导致执行许多 class 构造函数的级联效应。
- Authenticode 验证会增加启动时间。 Authenticode 签名的程序集必须通过证书颁发机构 (CA) 进行验证。此验证可能很耗时,因为它可能需要多次连接到网络才能下载当前的证书吊销列表。它还确保在通往受信任根的路径上存在完整的有效证书链。在加载程序集时,这可能会导致几秒钟的延迟。
您可以在 Application Startup Time 文章中阅读更多相关信息。
连接 属性 设置为真后,您的加载项是否显示在禁用项目列表中?
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 文章中阅读更多相关信息。
您是否尝试过手动启用加载项?你得到相同的结果吗?