可以通过优化为 Office 应用程序创建的 VSTO 外接程序为用户提供更好的体验,以便他们快速启动、关闭和打开项,以及执行其他任务。 如果你的 VSTO 外接程序是用于 Outlook 的,则还可以降低由于性能不佳而禁用 VSTO 外接程序的风险。 可以通过实现以下策略来提高 VSTO 外接程序的性能:
-
有关如何优化 Outlook VSTO 外接程序的详细信息,请参阅 性能条件以保持启用 VSTO 外接程序。
按需加载 VSTO 外接程序
可以将 VSTO 外接程序配置为仅在下列情况下加载:
安装 VSTO外接程序后,用户第一次启动应用程序时。
随后任何时间启动应用程序后,用户与 VSTO 外接程序第一次交互时。
例如,当用户选择标记为 “获取我的数据”的自定义按钮时,VSTO 外接程序可能会使用数据填充工作表。 应用程序必须至少加载一次 VSTO 外接程序,以便 “获取我的数据 ”按钮可以出现在功能区中。 但是,当用户下次启动应用程序时,VSTO 外接程序不会再次加载。 VSTO 外接程序仅在用户选择 “获取我的数据” 按钮时加载。
配置 ClickOnce 解决方案以按需加载 VSTO 外接程序
在 “解决方案资源管理器”中,选择项目节点。
在菜单栏上,依次选择“查看” >“属性页” 。
在 “发布” 选项卡上,选择 “选项” 按钮。
在 “发布选项” 对话框中,选择 “Office 设置” 列表项,选择 “按需加载” 选项,然后选择 “确定” 按钮。
配置 Windows Installer 解决方案以按需加载 VSTO 外接程序
在注册表中,将
LoadBehavior
Root\Software\Microsoft\办公室\ApplicationName\Addins\Addins\Add-in ID 键的条目设置为0x10。有关详细信息,请参阅 VSTO 外接程序的注册表项。
将解决方案配置为在调试解决方案时按需加载 VSTO 外接程序
创建一个脚本,用于将
LoadBehavior
Root\Software\Microsoft\办公室\ApplicationName\Addins\Addins\Add-in ID 键的条目设置为0x10。下面的代码演示了此脚本的一个示例。
[HKEY_CURRENT_USER\Software\Microsoft\Office\Excel\Addins\MyAddIn] "Description"="MyAddIn" "FriendlyName"="MyAddIn" "LoadBehavior"=dword:00000010 "Manifest"="c:\\Temp\\MyAddIn\\bin\\Debug\\MyAddIn.vsto|vstolocal"
创建一个使用脚本更新注册表的生成后事件。
下面的代码演示了可添加到生成后事件的命令字符串的示例。
regedit /s "$(SolutionDir)$(SolutionName).reg"
有关如何在 C# 项目中创建生成后事件的信息,请参阅如何:指定生成事件(C#)。
有关如何在 Visual Basic 项目中创建生成后事件的信息,请参阅如何:指定生成事件(Visual Basic)。
使用 Windows Installer 发布办公室解决方案
如果使用 Windows Installer 发布解决方案,Visual Studio 2010 Tools for 办公室 运行时会在 VSTO 外接程序加载时绕过以下步骤。
验证清单架构。
自动检查更新。
验证部署清单的数字签名。
注意
如果将 VSTO 外接程序部署到用户计算机上的安全位置,则不需要此方法。
有关详细信息,请参阅使用 Windows Installer 部署办公室解决方案。
绕过功能区反射
如果使用 Visual Studio 2012 生成解决方案,请确保用户在部署解决方案时安装了最新版本的 Visual Studio 2010 Tools for 办公室 运行时。 旧版本的 VSTO 运行时反映在解决方案程序集中以查找功能区自定义项。 此过程可导致 VSTO 外接程序加载变慢。
或者,你可以阻止任何版本的 Visual Studio 2010 Tools for 办公室 运行时使用反射来标识功能区自定义项。 若要遵循此策略,请重写 CreateRibbonExtensibility
该方法,并显式返回功能区对象。 如果 VSTO 外接程序不包含任何功能区自定义项,请在方法内返回 null
。
以下示例基于字段的值返回 Ribbon 对象。
protected override Microsoft.Office.Core.IRibbonExtensibility
CreateRibbonExtensibilityObject()
{
if (myCondition == true)
{
return Globals.Factory.GetRibbonFactory().CreateRibbonManager(
new Microsoft.Office.Tools.Ribbon.IRibbonExtension[] { new Ribbon1() });
}
else
{
return Globals.Factory.GetRibbonFactory().CreateRibbonManager(
new Microsoft.Office.Tools.Ribbon.IRibbonExtension[] { new Ribbon2() });
}
}
在单独的执行线程中执行成本高昂的操作
请考虑在单独的线程中执行耗时的任务(如长时间运行的任务、数据库连接或其他类型的网络调用)。 有关详细信息,请参阅 办公室 中的线程支持。
注意
调入 Office 对象模型的所有代码都必须在主线程中执行。